C – Замена слов

Моя цель здесь – прочитать текст из файла, перенаправленного из stdin, а затем заменить определенные argv переданные слова словом «Заменено».

Например, если я запускаю:

$ ./a.exe line < input.txt 

где input.txt – «Test line one», в конце я должен напечатать «Test Replaced one». Я не совсем уверен, где мой код идет не так, иногда я получаю ошибку сегментации, и я также не уверен, как я буду печатать строку newOut, или если мне это даже нужно.

В качестве побочного примечания, если бы я читал, используя fgets, что, если 59-й символ запустил «li», тогда, когда он начал читать снова как 0-й индекс для следующей команды чтения «ne». Разве это не считалось бы одной строкой для strstr для поиска?

Любая помощь приветствуется, спасибо

 #include  #include  #include  int main(int argc, char** argv) { char fileRead[60]; char newOut[]; while (!feof(stdin)){ fgets(fileRead,60,stdin); //read file 60 characters at a time if (strstr(fileRead,argv[1])){ // if argumentv[1] is contained in fileRead strncpy(newOut, fileRead, strlen(argv[1])); // replace } } return (0); } устройства #include  #include  #include  int main(int argc, char** argv) { char fileRead[60]; char newOut[]; while (!feof(stdin)){ fgets(fileRead,60,stdin); //read file 60 characters at a time if (strstr(fileRead,argv[1])){ // if argumentv[1] is contained in fileRead strncpy(newOut, fileRead, strlen(argv[1])); // replace } } return (0); } 

Как я заметил в комментариях к вашему предыдущему вопросу, C – лучший метод для замены :

Очевидное предложение состоит в том, чтобы читать целые строки с помощью fgets() а затем искать их (возможно, с помощью strstr() ), чтобы найти слово, которое нужно заменить, а затем распечатать материал перед словом и заменяющим текстом, прежде чем возобновлять поиск после (поэтому [данный "test" как argv[1] ] строка, содержащая "testing, 1, 2, 3, tested!" заканчивается как "Replaced!ing, 1, 2, 3, Replaced!ed!" .

Это довольно прямолинейная реализация описанного алгоритма.

 #include  #include  #include  #include  int main(int argc, char **argv) { assert(argc > 1); char fileRead[4096]; /* Show me a desktop computer where this causes trouble! */ char replace[] = "Replaced!"; size_t word_len = strlen(argv[1]); while (fgets(fileRead, sizeof(fileRead), stdin) != 0) { char *start = fileRead; char *word_at; while ((word_at = strstr(start, argv[1])) != 0) { printf("%.*s%s", (int)(word_at - start), start, replace); start = word_at + word_len; } printf("%s", start); } return (0); } 

Обратите внимание, что позиция assert() делает этот код C99; поместите его после определения word_len и он станет кодом C89.