按Enter键时,从控制台读取不会停止

时间:2012-06-22 11:50:55

标签: c

我正在阅读PrenticeHall。 The C Programming Language - 第二个Ed.Kernighan,Ritchie。

在本书(pg-20)中给出了一个程序示例,该程序应该打印用户在控制台窗口中键入的字符数,这是它的代码。

#include <stdio.h>

main()
{
    double nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;

    printf("%.0f\n", nc);
}

但是当我运行它并在控制台中键入内容时,它根本不会打印任何内容,光标会一直闪烁。 这正是该书中编写代码的方式。

我也尝试过另一种方式,但这也没有用,与之前的代码相同。

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
            ++nc;

    printf("%ld\n", nc);
}

如何使这件事有用?

P.S。 我正在使用Windows操作系统。 (静止)

4 个答案:

答案 0 :(得分:6)

原因是代码尝试读取所有输入直到文件结尾。如果这个程序是从一个文件中读取的,它会知道它什么时候结束,但是因为它从控制台读取,你必须明确告诉它输入结束了。在Linux上,您可以在Windows ^D上按^Z(Ctrl + D)(Ctrl + Z)来执行此操作。

请注意,必须在新行的开头处完成,即在按下Enter后,按^D(在Win上^Z)。

  

我正在阅读PrenticeHall。 Ansi C编程语言 - 第2版   Ed.Kernighan,里奇。

这是一本非常好的书,你正在阅读。这很好,我想,它包含了你问题的答案。

答案 1 :(得分:5)

您的两个程序都有效,您只需输入EOF,就像我在您问题下面的第一条评论中指出的那样。那是Linux下的^D(Control-D)和Windows下的^Z(Control-Z)。

请注意循环中的两个条件都在寻找EOF not或其他一些要终止的输入。提供此输入后,循环将终止,并显示您的计数。

答案 2 :(得分:3)

您应该停止输入录制`EOF'字符(GNU / Linux上的Ctrl + D)。

答案 3 :(得分:2)

我的编译器(GCC 4.4)对您发布的代码进行了狡辩。这消除了狡辩:

#include <stdio.h>

int main()
{
    int nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
    return 0;
}

但其他答案是正确的:您必须使用Ctrl-D或-Z结束键盘输入。

我不确定为什么Kernighan和Ritchie在这种情况下使用了double