我一直在研究一种审查单词的功能。我已经创建了这个函数并且它可以工作,除了它只接受一个参数。例如,当我执行“./a.out test< example.txt”时,它将“test”替换为“example.txt”中的CENSORED。但是当我添加另一个时,例如“./a.out test test2< example.txt”,它只替换“test”,而不是“test”和“test2”。
有人可以帮我解决我的问题吗?我不知道我做错了什么。
这是功能:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
assert(argc > 1);
char fileRead[4096];
char replace[] = "CENSORED";
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);
}
printf("\n");
return (0);
}
答案 0 :(得分:1)
我建议您在argv
元素1
到argc - 1
之间放置一个中间循环。在每次迭代中,它将处理该行以审查相应的参数,就像您的函数现在仅对第一个参数一样。
int arg;
for (arg = 1; arg < argc; arg += 1) {
/* ... censor argv[arg] ... */
}
请注意,您也可以删除assert()
,因为构造参数访问自然会避免访问其边界之外的argv
数组(如果没有指定参数,程序将在没有审查任何事情)。