2014-10-03 189 views
-1

我的目標是從stdin重定向的文件中讀取文本,然後用單詞「替換」替換某些argv傳遞的單詞。C - 替換單詞

例如,如果我跑:「測試取代一個」

$ ./a.exe line < input.txt 

其中input.txt的是「測試線合一」,到了最後我要打印 我不太確定我的代碼出錯的地方,有時我會出現分段錯誤,而且我也不確定如何去打印newOut字符串,或者我甚至需要一個字符串。作爲一個方面說明,如果我正在使用fgets進行讀取,如果第59個字符開始「li」,然後又開始讀取作爲下一個讀取命令「ne」的第0個索引時該怎麼辦。難道這不算作strstr搜索的一個字符串嗎?

任何幫助表示讚賞,感謝

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

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); 
} 
+0

請粘貼實際代碼先生,至少編譯的東西 – 4pie0 2014-10-03 21:01:40

+1

另請參見:[C - 一種更好的替換方法](http://stackoverflow.com/questions/26171698/c-better-method-for-replacing)由同一個用戶。 – 2014-10-03 21:04:12

+0

@JonathanLeffler,是的,我試着實現所提出的建議,並且不確定我要出錯的地方。 – ImBadAtProgramming 2014-10-03 21:15:49

回答

1

正如我在評論中觀察到你前面的問題,C — A better method for replacing

一個明顯的建議是閱讀整線,fgets()然後搜索那些(可能用strstr())查找要替換的單詞,然後在該單詞和替換文本之前打印該單詞,然後再從該行中的匹配單詞後面繼續搜索(所以[給出"test" as argv[1]]一條包含"testing, 1, 2, 3, tested!"的行結尾爲"Replaced!ing, 1, 2, 3, Replaced!ed!"

這是所述算法的相當直接的實現。

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

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代碼。