【问题标题】:C - Getchar in a nested while loop causing infinite loopC-嵌套while循环中的Getchar导致无限循环
【发布时间】:2019-02-10 01:14:03
【问题描述】:

我目前正在尝试计算文本文件中的字符数,不包括行 cmets(例如 //comment),因此我正在尝试识别注释的开头(//)并使用 while 循环来读取直到我遇到 EOF 或换行符为止的评论,因此我知道评论已经结束。问题是,当我使用双 while loop() 过滤掉行 cmets 时,它会导致无限循环,因为它不会退出内部 while 循环。这是我的代码。有没有人知道为什么会这样?我难住了。

int numChars = 0;
int c = 0;
int prevc = 0;

while ((c = getchar()) != EOF) {
        if (c == '/' && prevc == c) {
            while (c != '\n' || c != EOF) {
                c = getchar();
            }
        }

    numChars++;
    prevc = c;
}

例如,如果文本文件包含 //Hello,它应该输出 0 个字符,而如果文本文件包含 Hello,它应该输出 5 个字符。

【问题讨论】:

    标签: c


    【解决方案1】:

    c != '\n' || c != EOF 始终为真。

    只有当两个条件都为假时才可能为假,这意味着c == '\n'c == EOF 都为真。显然,这两者不可能都为真(除非EOF'\n' 相同,但事实并非如此)。

    您需要使用&&,而不是||

    【讨论】:

    • 我把它改成了 c != '\n' && c != EOF 但由于某种原因,在 //Hello 的输入上,numchars 仍然是 1,但它应该是 0,因为我' m 忽略所有 cmets。你知道这是为什么吗?
    • @wanderingstu:因为您计算换行符。我认为这是正确的;计数应该是 1。但我想这取决于作业中的精确要求。
    • 但我认为它应该是 0,因为在这种情况下,我只是在最后输入一个没有换行符的评论。对吗?
    • @wanderingstu:你如何在最后没有换行符的情况下输入评论?你不是在评论末尾按回车键吗?如果你把输入放到一个文件中,你几乎肯定会在末尾有一个换行符(使用hd 来查看文件的确切内容。)
    • @wanderingstu 如果您不希望“不带换行符的评论”不计入数,请不要在检测到 EOF 时让代码继续执行 numChars++; prevc = c;
    【解决方案2】:

    这句话总是正确的。

    while (c != '\n' || c != EOF)
    

    因此是一个无限循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2013-02-22
      • 2013-08-26
      相关资源
      最近更新 更多