知道为什么以下代码不打印输入中的字符数吗?我直接从 K&R 书中得到了这个。目前正在学习 C,这真的很令人困惑,在我看来,我永远不会达到 EOF。如果是这样,那为什么要用这个作为例子呢?
#include <stdio.h>
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%d\n", nc);
}
知道为什么以下代码不打印输入中的字符数吗?我直接从 K&R 书中得到了这个。目前正在学习 C,这真的很令人困惑,在我看来,我永远不会达到 EOF。如果是这样,那为什么要用这个作为例子呢?
#include <stdio.h>
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%d\n", nc);
}
该程序看起来正确,您的问题是您必须EOF
在输入后将(文件结尾)发送到命令行,因为标准输入被视为文件。我认为在 linux 终端中,您可以按 Ctrl+D 发送EOF
...我不确定如何在其他操作系统中执行此操作。要测试此程序,您可能需要更改EOF
为'\n'
哪个会导致它在您按 Enter 时停止。
程序一直读取数据,stdin
直到EOF
收到数据,这是通过在 Unix 控制台上的行首按 Ctrl-D 或在 Windows 控制台的行首按 Ctrl-Z 来完成的。EOF
以这种方式发出信号后,printf
将执行显示读取的字符数的函数。
Your nc
is 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;
}
我想澄清到目前为止给出的答案,因为它们似乎使用“发送 EOF”、“收到 EOF”、“EOF 字符”等短语。根据对此答案的评论(感谢),“发送 EOF”和“received EOF”是合法的术语,但请不要认为它是一个字符。
EOF 根本不是一个字符。如果流位于“文件末尾”或发生读取错误,则它是 getchar()(或 fgetc/getc)返回的值。它只是 getchar() 将返回的字符值范围之外的特殊值,它指示错误或文件结束的条件。
它被 C 标准定义为负数,而 getchar 将字符作为转换为 int 的无符号字符返回。
编辑:在做一些我应该在我曾经写过的段落之前做的研究时,我意识到我的一些假设是完全错误的。感谢评论者指出这一点。
一旦流(例如标准输入)处于文件结束状态,可以使用 clearerr() 再次清除此状态,并且 getchar() 可以从标准输入读取更多数据。
此代码从标准输入中读取字符。当你正常运行这个程序时,标准输入来自用户。在这种情况下,没有办法向程序发送 EOF。
如果您将文件重定向到 (./myprogram < tempfile.txt) 中的标准,此代码将起作用。
首先,如前所述,您需要 %lf 而不是 %d 来显示双精度数,否则它将一直显示为零(d 是有符号整数)。然后,如果您想在基于 Windows 的操作系统上手动测试,输入某些字符,请按 Enter,然后在下一行单独按 CtrlZ(这将模拟 EOF)。打印结果将比字符数多一(包括 CtrlZ)。同样,正如 SoapBox 在寻找 EOF 时所指出的那样,当时的想法通常是 Unix,您可以通过标准输入将文件通过管道传输到程序中,这也可以。