1

我正在阅读 PrenticeHall。C 编程语言- 第 2 版。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);
}

关于如何使这件事起作用的任何想法?

PS我正在使用Windows操作系统。(仍然)

4

4 回答 4

6

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

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

我正在阅读 PrenticeHall。Ansi C 编程语言 - 第 2 版。Kernighan,Ritchie。

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

于 2012-06-22T11:54:49.240 回答
5

您的两个程序都可以工作,您只需要EOF按照我在您问题下方的第一条评论中指出的那样输入。即^DLinux下的(Control-D)和^ZWindows下的(Control-Z)。

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

于 2012-06-22T11:55:13.473 回答
3

您应该停止输入“EOF”字符(在 GNU/Linux 上为 Ctrl+D)。

于 2012-06-22T11:57:04.583 回答
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 和 Ritchiedouble在这种情况下使用了。

于 2012-06-22T12:00:01.480 回答