简单的字符计数程序表现异常

Simple char-counting program behaves strangely

这段代码应该计算用户输入的字符数,除了'\n',期望'\n'跟在其他'\n'之后。稍后我会解释这个。

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        do {
                while(getchar() != '\n')
                        numberOfChars++;
        } while(getchar() != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}

这里有一些例子:


输入: A,B,C, Ctrl + D

预期输出:3

实际输出:程序没有终止,并在屏幕上显示123^D


输入: A,B,C, 回车, Ctrl + D

预期输出:3

实际输出:3


输入: A,B,C, 输入, A, B,C,输入, Ctrl + D

预期输出:6

实际输出:6


输入: A,B,C, 输入, 输入, Ctrl + D

预期输出:4

实际输出:程序没有终止,并且在屏幕上显示:

abc

^D

我正在使用 OS X-10.10.5、bash-3.2 和 clang-700.1.81。

提前致谢。

您有 2 个 getchar() 调用 - 其中一个可以读取 EOF 或“\n”。你需要重构所以只有一个 getchar().

例如在你的第一个例子中没有'\n',所以你永远不会离开内部 while 循环。在你的第四个例子中,第二个 '\n' 被第二个 getchar 读取,所以你再次陷入内部 while 。

当内部循环返回 EOF 时,它不等于 '\n',因此循环再次尝试,得到另一个 EOF,但它仍然不是 '\n',所以它还有另一条路。电脑很有耐心…

在内循环中,使用:

int c;
while ((c = getchar()) != EOF && c != '\n')
    numberOfChars++;

这将在 EOF 或到达行尾时停止。

另请参阅我对您的 answer 的讨论 — 尽管我错过了内循环的 EOF 问题。

对上面 Jonathan 的回答稍作修改(以确保循环仅以 EOF 而不是 '\n' 停止):

编辑:此外,这是单循环解决方案(不需要外循环和内循环)。

int c;
while ((c = getchar()) != EOF)
{
    if(c != '\n')  numberOfChars++;
}

首先,我必须为我的问题中令人困惑的描述道歉:

...... except '\n', expect '\n's following other '\n'.

我的意思是:

...... except ('\n', expect '\n's following other '\n').

所以我的第四个例子没有错字。

最后想出了一个解决办法:

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        int c;
        do {
                while((c = getchar()) != '\n' && c != EOF )
                        numberOfChars++;
                while((c = getchar()) == '\n')
                        numberOfChars++;
        } while(c != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}

我相信这段代码可以很好地展示我想要的东西。