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


Автор: AleK135 5.8.2015, 16:10
Задача: заменить в тексте слова "компьютер" на "к*******р"
Подскажите, что не правильно
Код

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    
setlocale(LC_CTYPE,"RUS");
    int const N = 10;
   char str[500];
   char a[N] = "компьютер";
   char b[N] = "к*******р";
   ifstream file ("C:\\file.txt");
   while(!file.eof())
   {
       file.getline(str, 500);
       for(int i = 0; i < strlen(str); i++){
        if(strcmp(str, a)==0){
            for(int e = 1; e > N; e++){
                a[e] = b[e];
            }
           }
       }
        
       
   }
   file.close();
   
system("pause");
return 0;
}


Автор: feodorv 5.8.2015, 18:37
Цитата(AleK135 @  5.8.2015,  16:10 Найти цитируемый пост)
        if(strcmp(str, a)==0)

При сравнении строк функцией strcmp() предполагается, что она проверяет и  завершающие строки нулевые байты, иначе сравнение признаётся неудачным. Поэтому это сравнение сработает только в том случае, если строка str совпадает со строкой a. Если нужно сравнить подстроки, то пользуйтесь функцией strncmp():
Код
        if(strncmp(str, a, 9)==0)



Цитата(AleK135 @  5.8.2015,  16:10 Найти цитируемый пост)
            for(int e = 1; e > N; e++){

Ну а здесь цикл не выполнится ни разу из-за неразумного условия e > N. И почему Вы отсчитываете от 1? В общем случае (но когда длины строк a и b совпадают) это не верно.

Автор: kester36 5.8.2015, 20:41
вот тут уже сделали самописный str_replace() по аналогии с аналогичной функцией в php: http://2lx.ru/2010/03/str_replace-dlya-c/
Тут ещё несколько вариантов: http://www.cyberforum.ru/cpp-beginners/thread548138.html
гугл полезная вещь


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/V-tekste-zamenit-slova-kompyuter-na-kr-id55c20ba5ae2015547b8b4567#findElement_E7045_55c24accae2015273d2ec170_0

Автор: AleK135 5.8.2015, 21:00
Цитата(feodorv @ 5.8.2015,  18:37)
Цитата(AleK135 @  5.8.2015,  16:10 Найти цитируемый пост)
        if(strcmp(str, a)==0)

При сравнении строк функцией strcmp() предполагается, что она проверяет и  завершающие строки нулевые байты, иначе сравнение признаётся неудачным. Поэтому это сравнение сработает только в том случае, если строка str совпадает со строкой a. Если нужно сравнить подстроки, то пользуйтесь функцией strncmp():
Код
        if(strncmp(str, a, 9)==0)



Цитата(AleK135 @  5.8.2015,  16:10 Найти цитируемый пост)
            for(int e = 1; e > N; e++){

Ну а здесь цикл не выполнится ни разу из-за неразумного условия e > N. И почему Вы отсчитываете от 1? В общем случае (но когда длины строк a и b совпадают) это не верно.

Все сделал, но все равно не изменяет текст... smile 

Автор: feodorv 6.8.2015, 01:23
Цитата(AleK135 @  5.8.2015,  21:00 Найти цитируемый пост)
Все сделал, но все равно не изменяет текст...

Видимо, в теле цикла никак не учитывается переменная цикла i:
Цитата(AleK135 @  5.8.2015,  16:10 Найти цитируемый пост)
        if(strncmp(&str[i], a, 9)==0){


Автор: volatile 6.8.2015, 10:25
Цитата(AleK135 @  5.8.2015,  21:00 Найти цитируемый пост)
Все сделал, но все равно не изменяет текст...   

В строке 23, у вас модификация шаблона поиска, вместо замены файла.

Кроме того, вы изменяете только в памяти. Измененный файл, никуда не выводиться
т.е. никакую замену вы не увидите.

Автор: xvr 6.8.2015, 13:09
Для поиска подстроки в строке есть замечательная стандартная функция http://www.cplusplus.com/reference/cstring/strstr/. А для копирования - http://www.cplusplus.com/reference/cstring/memcpy/ (ну и еще http://www.cplusplus.com/reference/cstring/strlen/?kw=strlenдля вычисления длинны того, что надо копировать)



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