C - 更好的替换方法

时间:2014-10-03 00:35:34

标签: c file stdin

我正在寻找从word.txt包含“banana test apple”输出的文件中替换单词 - > “香蕉取而代之!苹果”它将要替换的词语将成为stdin的一个参数(在这种情况下为“测试”)

我不知道我的代码出错的地方,我也想知道是否有更好的方法来实现它,而不是获取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);
    }

2 个答案:

答案 0 :(得分:1)

我会这样做:

  1. 使用fgets
  2. 将所有文件读入缓冲区
  3. 使用strstr
  4. 寻找关键作品(测试)
  5. 使用strncpy
  6. 将其替换为新字符串
  7. 写入文件(或输出到stdout)无论你想做什么

答案 1 :(得分: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);
    }
}