【问题标题】:How to fix this comparing strings( from argv and scanf) program?如何修复这个比较字符串(来自 argv 和 scanf)程序?
【发布时间】:2019-02-09 20:19:55
【问题描述】:

试图修复这个程序,该程序比较通过 argv 找到的单词和来自 scanf() 的单词。如果找到相同的单词,则打印“CENSORED”,如果没有,则仅打印该单词。例如,我有一个名为 beatles.txt 的文件,其中包含以下单词: 保罗 林戈 乔治 约翰

如果我编译这个程序并像这样测试它: ./a.out ringo

审查 林戈 审查 林戈 审查 铃声

然而,我希望这是输出:

保罗 审查 乔治 约翰

这是我的代码:

int main(int argc, char* argv[]) {

char word_arr[10000][20];
int i=0;

while ( scanf("%s",word_arr[i])!=EOF) {

    for (int i=1; i<argc; i++) {

        if (strstr(word_arr[i],argv[i]) != NULL) {

            printf("CENSORED\n");
        }

        else {

            printf("%s\n",word_arr[i]);

        }

    }
i++;

}

return 0;

}

【问题讨论】:

  • 离题。
  • 内部i 正在遮蔽外部i。为其中一个标识符选择另一个名称。
  • 请不要对发布的代码进行更正。它成为一个非问题。回滚。

标签: c arrays scanf strstr


【解决方案1】:

正如@WeatherVane 所观察到的,

内部i 正在遮蔽外部i。为其中一个标识符选择另一个名称。

这是一种方法:

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

int main(int argc, char* argv[]) {
    char word_arr[10000][20];
    int j = 0;

    while (scanf("%s", word_arr[j]) != EOF) {
        bool is_censored = false;
        for (int i = 1; i < argc; i++) {
            if (strstr(word_arr[j], argv[i])) {
                printf("CENSORED ");
                is_censored = true;
                break;
            }
        }
        if (!is_censored) printf("%s ", word_arr[j]);
        j++;
    }

    printf("\n");
    return 0;
}

【讨论】:

  • 谢谢,我没注意到。这使它起作用,但前提是我尝试使用一个名称作为 scanf 输入。如果我执行 ./a.out john ringo
  • 效果很好。谢谢你。我有最后一个问题:假设我有一个包含 3 个句子(3 个不同的行)的文件。当我运行这段代码时,它只需要一句话。我该如何改变?如果我在“%s”后面加上一个“\n”,它会使每个单词都成为一个新行。任何线索我可以如何做到这一点而不改变文件中的句子结构?
  • 哦,约翰,我将把修改留作练习。你能行的。我相信你。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2019-12-24
  • 1970-01-01
  • 2021-03-01
  • 2015-03-03
  • 1970-01-01
相关资源
最近更新 更多