7

知道为什么以下代码不打印输入中的字符数吗?我直接从 K&R 书中得到了这个。目前正在学习 C,这真的很令人困惑,在我看来,我永远不会达到 EOF。如果是这样,那为什么要用这个作为例子呢?

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
}
4

6 回答 6

12

该程序看起来正确,您的问题是您必须EOF在输入后将(文件结尾)发送到命令行,因为标准输入被视为文件。我认为在 linux 终端中,您可以按 Ctrl+D 发送EOF...我不确定如何在其他操作系统中执行此操作。要测试此程序,您可能需要更改EOF'\n'哪个会导致它在您按 Enter 时停止。

于 2008-12-05T01:26:38.097 回答
7

程序一直读取数据,stdin直到EOF收到数据,这是通过在 Unix 控制台上的行首按 Ctrl-D 或在 Windows 控制台的行首按 Ctrl-Z 来完成的。EOF以这种方式发出信号后,printf将执行显示读取的字符数的函数。

于 2008-12-05T01:25:53.200 回答
6

Your ncis a double — 用于printf("%lf", nc)打印双打。

试试这个

#include <stdio.h>

int main(void)
{
    int nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);

    return 0;
}
于 2008-12-05T01:39:20.973 回答
5

我想澄清到目前为止给出的答案,因为它们似乎使用“发送 EOF”、“收到 EOF”、“EOF 字符”等短语。根据对此答案的评论(感谢),“发送 EOF”和“received EOF”是合法的术语,但请不要认为它是一个字符。

EOF 根本不是一个字符。如果流位于“文件末尾”或发生读取错误,则它是 getchar()(或 fgetc/getc)返回的值。它只是 getchar() 将返回的字符值范围之外的特殊值,它指示错误或文件结束的条件

它被 C 标准定义为负数,而 getchar 将字符作为转换为 int 的无符号字符返回。

编辑:在做一些我应该在我曾经写过的段落之前做的研究时,我意识到我的一些假设是完全错误的。感谢评论者指出这一点。

一旦流(例如标准输入)处于文件结束状态,可以使用 clearerr() 再次清除此状态,并且 getchar() 可以从标准输入读取更多数据。

于 2008-12-05T02:46:40.853 回答
1

此代码从标准输入中读取字符。当你正常运行这个程序时,标准输入来自用户。在这种情况下,没有办法向程序发送 EOF。

如果您将文件重定向到 (./myprogram < tempfile.txt) 中的标准,此代码将起作用。

于 2008-12-05T01:24:46.650 回答
0

首先,如前所述,您需要 %lf 而不是 %d 来显示双精度数,否则它将一直显示为零(d 是有符号整数)。然后,如果您想在基于 Windows 的操作系统上手动测试,输入某些字符,请按 Enter,然后在下一行单独按 CtrlZ(这将模拟 EOF)。打印结果将比字符数多一(包括 CtrlZ)。同样,正如 SoapBox 在寻找 EOF 时所指出的那样,当时的想法通常是 Unix,您可以通过标准输入将文件通过管道传输到程序中,这也可以。

于 2008-12-05T06:55:09.277 回答