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


Автор: fire64 12.10.2009, 20:49
Написал такой текст для замены слов в тексте

Код

int ReplaceCode( char *origin, char *replace )
{
    char *pch = strstr (mapdata, origin);
    
    if(pch)
    {
        strncpy (pch, replace, strlen(replace));
    }
    else
    {
        return 0;
    }
    
    return 1;
}


если длина слов одинаковая, то все нормально, если разная то возникают проблемы

дело в том что производится не замена одного слова другим, а запись одного поверх другого

подскажите как реализовать именно замену

Автор: zim22 12.10.2009, 20:58
Цитата(fire64 @  12.10.2009,  20:49 Найти цитируемый пост)
подскажите как реализовать именно замену

на С++ есть std::string и метод replace

Автор: fire64 12.10.2009, 22:14
zim22, пробовал
не вышло

Код

int ReplaceCode( char *origin, char *replace )
{

    string str(mapdata);
    string key(origin);
    string inserter( replace );

    if(str.find(key))
    {
        for(int pos = str.find(key); pos != string::npos; pos = str.find(key, pos + 4))
        {
            str.replace(pos, key.length(), inserter);
        }
    }
    else
    {
        return 0;
    }

    return 1;
}

Автор: zim22 12.10.2009, 22:27
Цитата(fire64 @  12.10.2009,  22:14 Найти цитируемый пост)
zim22, пробовалне вышло

Код

bool ReplaceCode(string &text, string pattern, string replace) {
  string::size_type idx = text.find(pattern);
  if (idx != string::npos) {
    text.replace(idx, pattern.length(), replace);
    return true;
  }
  return false;
}

int main() {
  std::string text("hello my dear friend");
  ReplaceCode(text, "my", "bugaga");
}


Автор: fire64 12.10.2009, 23:09
хм все равно не работает


Код

char *mapdata;

bool ReplaceCode(string pattern, string replace) 
{
    string text = mapdata;

    string::size_type idx = text.find(pattern);

    if (idx != string::npos) 
    {
        text.replace(idx, pattern.length(), replace);
        return true;
    }

    return false;
}

void ReplaceEntities(char *originentity, char *replacentity)
{

    char original[512];

    char replace[512];

    sprintf(original, "\"classname\" \"%s\"",  originentity  );

    sprintf(replace, "\"classname\" \"%s\"",  replacentity  );

    while(    ReplaceCode( original, replace ) )
    {

    }
}

int main( int argc, char **argv )
{
    FILE *fp;
    fp = fopen( argv[1], "rb" );

    fseek( fp, 0, SEEK_END );
    int len = ftell( fp );
    rewind( fp );

    mapdata = (char*) malloc (sizeof(char)*len);    ;

    fread( mapdata, 1, len, fp );

    ReplaceEntities("static_prop", "prop_static");
}


проблема в том что ReplaceCode не возвращает false даже после замены


Автор: Dov 13.10.2009, 02:27
Как-то так, вроде должно быть...
Код
char * mapdata;

void ReplaceCode(char *origin, char *replace )
{
    char   tmp[512];
    char * pch = strstr(mapdata, origin);

    while(pch)
    { 
        strcpy(tmp, replace);        
        strcat(tmp, pch + strlen(origin));
        strcpy(pch, tmp); 

        pch = strstr(pch, origin);        
    } 
}

void ReplaceEntities(char *originentity, char *replacentity)
{ 
    char original[512];
    char replace[512];

    sprintf(original, "\"classname\" \"%s\"",  originentity  );
    sprintf(replace, "\"classname\" \"%s\"",  replacentity  );

    ReplaceCode(original, replace );   
}

Автор: fire64 13.10.2009, 13:25
Dov, при выполнении

Код

strcat(tmp, pch + strlen(origin));


происходит выход из программы

я думал что это из-за недостаточного выделения памяти, но увеличение tmp, до 1024*100 не приводит к изменением, а 1024*1024 приводит к падению с ошибкой

п.с.
разобрался

сделал так

Код

char  *tmp = (char*) malloc (sizeof(char)*strlen(mapdata) * 4);


и
Код

mapdata = (char*) malloc (sizeof(char)*len * 4);

Автор: xvr 13.10.2009, 13:50
Цитата(fire64 @ 12.10.2009,  23:09)
Код

char *mapdata;
bool ReplaceCode(string pattern, string replace) 
{
    string text = mapdata;
    string::size_type idx = text.find(pattern);
    if (idx != string::npos) 
    {
        text.replace(idx, pattern.length(), replace);
        return true;
    }
    return false;
}

проблема в том что ReplaceCode не возвращает false даже после замены

Проблема в том, что ReplaceCode делает этот replace в локальной переменной text и нигде больше. Переменная счастливо погибает при возврате из ReplaceCode, а вместе с ней и все результаты собственно работы самой процедуры

Автор: fire64 13.10.2009, 14:28
xvr, точно

дописал после

Код

text.replace(idx, pattern.length(), replace);


Код

strcpy(mapdata, text.c_str());


вот только есть проблема

fwrite( mapdata, strlen(mapdata), 1, wp );

добавляет в конце кучу мусора из-за

mapdata = (char*) malloc (sizeof(char)*len * 2);

Автор: xvr 13.10.2009, 16:29
Цитата(fire64 @ 13.10.2009,  14:28)
вот только есть проблема
fwrite( mapdata, strlen(mapdata), 1, wp );
добавляет в конце кучу мусора из-за
mapdata = (char*) malloc (sizeof(char)*len * 2);

Не должно. fwrite пишет ровно столько, сколько есть в строке, а не столько, сколько было заказано через malloc. Либо в конце строки потерялся завершающий нуль (тогда strlen вернет неизвестно что), либо (если выходной файл бинарный) можно/нужно писать строку вместе с завершающим нулем (в fwrite подать strlen()+1)

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