Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замен слов в строках 
:(
    Опции темы
fire64
Дата 12.10.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Написал такой текст для замены слов в тексте

Код

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


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

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

подскажите как реализовать именно замену
PM MAIL   Вверх
zim22
Дата 12.10.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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


--------------------
PM MAIL   Вверх
fire64
Дата 12.10.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



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;
}

PM MAIL   Вверх
zim22
Дата 12.10.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(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");
}



Это сообщение отредактировал(а) zim22 - 12.10.2009, 22:36


--------------------
PM MAIL   Вверх
fire64
Дата 12.10.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



хм все равно не работает


Код

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 даже после замены


PM MAIL   Вверх
Dov
Дата 13.10.2009, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Как-то так, вроде должно быть...
Код
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 );   
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
fire64
Дата 13.10.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



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);


Это сообщение отредактировал(а) fire64 - 13.10.2009, 14:08
PM MAIL   Вверх
xvr
Дата 13.10.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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, а вместе с ней и все результаты собственно работы самой процедуры


Это сообщение отредактировал(а) xvr - 13.10.2009, 13:50
PM MAIL   Вверх
fire64
Дата 13.10.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



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);
PM MAIL   Вверх
xvr
Дата 13.10.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.