2014-10-03 3 views
1

Я ищу, чтобы заменить слова из файла, где word.txt содержит «банановое тестовое яблоко», будет выводиться -> «banana Replaced! Apple» Слова, которые он хотел бы заменить, пришли бы как аргумент для stdin («тест» в этом случае)C - Лучший способ для замены

Не знаете, где мой код идет не так, и мне также интересно, есть ли лучший способ сделать это, чем получить функцию getchar(), поскольку я нахожу это путают работать и раздражать, поскольку вы не можете копировать символы.

Любые предложения? Благодаря

$ ./a.exe test < words.txt 


    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    int main(int argc, char** argv) { 
     int c = getchar();  
     int counter = 0; 


     int i,index; 
     for (i = 1; i < argc; i++){ 
      for (index = 0; index < strlen(argv[i]); index++){ 
       while (c == argv[i][index]){ 
        counter++; 
        c = getchar(); 
        index++; 
        if (counter == strlen(argv[i])){ 
         printf("Replaced!"); 
        } 
       } 
       printf("%c ",c); 
       c = getchar(); 
       counter = 0; 
      } 
     } 
     return (0); 
    } 
+0

Очевидное предложение читать целые строки с 'fgets()', а затем искать те (возможно, с 'strstr()'), чтобы найти слово, чтобы заменить, а затем распечатать материал перед словом и замените текст перед возобновлением поиска после совпадающего слова в строке (так что строка, содержащая «тестирование», 1, 2, 3, проверена! »« заканчивается как «» Заменена! ing, 1, 2, 3, Заменена ! ed! "'. –

+1

Можете ли вы объяснить алгоритм, который, по вашему мнению, ваш код реализует - или, по крайней мере, добавлять к нему комментарии? –

+0

Пожалуйста, внесите любой ввод в свою программу и любой вывод, который он производит при задании вопроса. просто покажите нам запущенную вами командную строку, но покажите нам ввод и вывод. В соответствии с этой командной строкой и кодом вы передаете содержимое word.txt в stdin * (так его источник данных для ваших вызовов getchar()), а затем вы перебираете буквы argv [1] «test» по какой-то причине, чтобы получить t-e-s-t. Это никак не связано с вашим описанием. Как говорит @DavidSchwartz, по крайней мере, комментируйте свои заблуждения, чтобы у нас был шанс обратиться к ним. – HostileFork

ответ

1

Я хотел бы сделать это следующим образом:

  1. прочитать все файлы в буфер, используя fgets
  2. ищет ключ работу (тест) с использованием strstr
  3. замените его новая строка с использованием strncpy
  4. пишите в файл (или выведите на стандартный вывод), что вы хотите сделать
0

Вы можете использовать scanf читать слова в то время:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char wordbuffer[100]; 
    while (scanf("%99s", wordbuffer) == 1) 
    { 
     int replace = 0; 
     for (int i = 1; i < argc && !replace; i++) 
      if (strcmp(wordbuffer, argv[i]) == 0) 
       replace = 1; 

     if (replace) 
      printf("Replaced! "); 
     else 
      printf("%s ", wordbuffer); 
    } 
} 

Если вы используете современную систему, которая соответствует последней спецификации POSIX, вы можете воспользоваться персонажем в m присвоении распределения , и у вас будет выделено соответствующее пространство, так что вам не нужно использовать какое-либо произвольное максимальное количество символов.

int main(int argc, char *argv[]) 
{ 
    char *wordbuffer; 
    while (scanf("%ms", &wordbuffer) == 1) 
    { 
     int replace = 0; 
     for (int i = 1; i < argc && !replace; i++) 
      if (strcmp(wordbuffer, argv[i]) == 0) 
       replace = 1; 

     if (replace) 
      printf("Replaced! "); 
     else 
      printf("%s ", wordbuffer); 

     free(wordbuffer); 
    } 
} 
Смежные вопросы