2014-10-03 156 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代码。