Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как с массива чаров найти и удалить


Автор: Sergio 8.10.2008, 17:20
Как с массива чаров найти и удалить фрагмент строки.
 Может может есть стандартный алгоритм STL?
Нужно что-то типа этого:
Код

char* result = FindAndDestroy(char* destination, char* fragment);

Автор: Lin07 8.10.2008, 19:29
может replace(find,"") ?

Код

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;


int main()
{
    const int VECTOR_SIZE = 8 ;

    // Define a template class vector of integers
    typedef vector<int > IntVector ;

    //Define an iterator for template class vector of integer
    typedef IntVector::iterator IntVectorIt ;

    IntVector Numbers(VECTOR_SIZE) ;   //vector containing numbers

    IntVectorIt start, end, it ;

    start = Numbers.begin() ;   // location of first
                                // element of Numbers

    end = Numbers.end() ;       // one past the location
                                // last element of Numbers

    //Initialize vector Numbers
    Numbers[0] = 10 ;
    Numbers[1] = 20 ;
    Numbers[2] = 10 ;
    Numbers[3] = 15 ;
    Numbers[4] = 12 ;
    Numbers[5] = 7 ;
    Numbers[6] = 9 ;
    Numbers[7] = 10 ;

    cout << "Before calling replace" << endl ;

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

    // remove all elements from Numbers that match 10
     replace(start, end, 10, 35) ;

    cout << "After calling replace, to replace all 10's with 35" << endl ;

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

}


ps для векторов она работает, но вот с чарами не знаю будет ли она  работать... вот со тончно нгами да... 

Автор: Sergio 8.10.2008, 20:30
Сделал попроще (я думаю)
Код

// return number of index from which fragment begins
// if return -1 than not found
int find_fragment(char* dest, char* fragment)
{
    int res = -1;

    for (int a = 0; a < strlen(dest); a++)
    {
        if (dest[a] == fragment[0])
        {
            for (int b = 0; b < strlen(fragment); b++)
            {
                if (dest[a + b] == fragment[b])
                {
                    res = a;
                    continue;        // it's ok go ahead
                }    
                else
                {
                    res = -1;
                    break;            // find next
                }
            }
        }
        if (res != -1)                // only one matching should be
            return res;
    }
    return res;
}

Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    int res = find_fragment(dest, fragment);

    char resStr[100];
    int d = 0;
    if (res != -1)
    {
        for (int c = 0; c<strlen(dest); c++)
        {
            if (c < res || c >= strlen(fragment))
            {
                resStr[d] = dest[c];
                d++;
            }    
        }    
        resStr[strlen(dest) - strlen(fragment)] = '\0';
    }
    return 0;
}

Пожалуйста порефакторьте код. Потому как он очень большой( 
P.S. извините за на звание переменных smile 

Автор: Rickert 9.10.2008, 05:57
Руками всегда самый верный способ

Автор: xvr 9.10.2008, 10:02
Цитата(Sergio @ 8.10.2008,  20:30)
Сделал попроще (я думаю)
Код

// return number of index from which fragment begins
// if return -1 than not found
int find_fragment(char* dest, char* fragment)
{
    int res = -1;

    for (int a = 0; a < strlen(dest); a++)
    {
        if (dest[a] == fragment[0])
        {
            for (int b = 0; b < strlen(fragment); b++)
            {
                if (dest[a + b] == fragment[b])
                {
                    res = a;
                    continue;        // it's ok go ahead
                }    
                else
                {
                    res = -1;
                    break;            // find next
                }
            }
        }
        if (res != -1)                // only one matching should be
            return res;
    }
    return res;
}

Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    int res = find_fragment(dest, fragment);

    char resStr[100];
    int d = 0;
    if (res != -1)
    {
        for (int c = 0; c<strlen(dest); c++)
        {
            if (c < res || c >= strlen(fragment))
            {
                resStr[d] = dest[c];
                d++;
            }    
        }    
        resStr[strlen(dest) - strlen(fragment)] = '\0';
    }
    return 0;
}

Пожалуйста порефакторьте код. Потому как он очень большой( 
P.S. извините за на звание переменных smile

Да уж, проще некуда  smile 
Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    char* fr=strstr(dest, fragment);
    if (fr)
     {
       char* fr2=fr+strlen(fragment);
       memmove(fr,fr2,strlen(fr2)+1);
     }

    return 0;
}

Автор: mrbrooks 9.10.2008, 10:07
Цитата(Rickert @  9.10.2008,  05:57 Найти цитируемый пост)
Руками всегда самый верный способ 
 Не согласен  smile 

Цитата(xvr @  9.10.2008,  10:02 Найти цитируемый пост)
Да уж, проще некуда  smile 
 Согласен  smile 

Sergio, я вообще на столько обленилсо, что юзаю только std::string - и мне от этого так хорошо, в отличие от массивов char. Тем более их можно друг с дружкой подружить.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)