简单的字符计数程序表现得很奇怪

时间:2016-02-09 07:24:07

标签: c bash input getchar

此代码应计入用户输入的字符数,但' \ 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。

提前致谢。

4 个答案:

答案 0 :(得分:1)

您有两个getchar()来电 - 其中一个可以阅读EOF或&#39; \ n&#39;。您需要重构,因此只有一个getchar()

e.g。在你的第一个例子中没有&#39; \ n&#39;,所以你永远不会离开内在的while循环。在你的第四个例子中,第二个&#39; \ n&#39;由第二个getchar读取,所以你再次陷入内心。

答案 1 :(得分:1)

当内循环返回EOF时,它不等于'\n',因此循环再次尝试,得到另一个EOF,它仍然不是{{1}所以它有另一个去。电脑很耐心......

在内循环中,使用:

'\n'

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

另请参阅我对answer附带的讨论 - 虽然我错过了内循环的EOF问题。

答案 2 :(得分:1)

对Jonathan的上述答案稍作修改(以确保循环仅使用EOF停止,而不是&#39; \ n&#39;):

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

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

答案 3 :(得分:0)

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

  

......除了   '\ n',期待'\ n'跟随其他'\ n'。

我的意思是:

  

......除了   ('\ n',期待'\ n'关注其他'\ 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;
}

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