【问题标题】:C - Better method for replacingC - 更好的替换方法
【发布时间】:2014-10-03 00:35:34
【问题描述】:

我正在寻找替换 word.txt 包含的文件中的单词“香蕉测试苹果”将输出 ->“香蕉替换!苹果”它要替换的单词将作为标准输入 ("测试”在这种情况下)

不确定我的代码哪里出错了,我也想知道是否有比 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);
    }

【问题讨论】:

  • 一个明显的建议是用fgets() 阅读整行然后搜索那些(可能用strstr())来找到要替换的单词,然后在单词和替换之前打印材料在从行中匹配的单词之后恢复搜索之前的文本(因此包含"testing, 1, 2, 3, tested!" 的行最终为"Replaced!ing, 1, 2, 3, Replaced!ed!"
  • 你能解释一下你认为你的代码实现的算法——或者至少给它添加 cmets 吗?
  • 请向您的程序提供任何输入以及当您提出问题时它产生的任何输出。所以不要只向我们展示你正在运行的命令行,而是向我们展示输入和输出。就目前而言,使用此命令行和代码,您将 words.txt 的内容通过管道传输到 stdin (因此它是您的 getchar() 调用的数据源),然后您正在循环argv[1] "test" 的字母出于某种原因得到 t-e-s-t。它与您的描述完全不符。正如@DavidSchwartz 所说,至少要评论您的误解,以便我们有机会解决它们。
  • @HostileFork:程序的输入来自标准输入,但要替换的单词来源来自命令行。
  • @dreamlax 你是怎么从./a.exe test &lt; words.txt 得到的? :-/ 程序本身不打开任何文件,使用 words.txt 的内容来管道标准输入,并且出于某种原因查看 argv[1] 中的字符 t-e-s-t。

标签: c file stdin


【解决方案1】:

我会这样做:

  1. 使用fgets将所有文件读入缓冲区
  2. 使用strstr寻找关键工作(测试)
  3. 使用strncpy 将其替换为您的新字符串
  4. 无论您想做什么,都可以写入文件(或输出到标准输出)

【讨论】:

    【解决方案2】:

    您可以使用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 assignment-allocation 字符,并为您分配适当数量的空间,这样您就没有使用任意的最大字符数。

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

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2017-11-19
      • 1970-01-01
      • 2017-10-07
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多