K& R书中的C编程练习

时间:2008-12-05 01:20:35

标签: c kernighan-and-ritchie

知道为什么以下代码不打印输入中的字符数量? 我直接从K& R书中读到了这本书。此刻学习C这真的很令人困惑,在我看来我永远不会达到EOF。如果是这种情况那么为什么会用这个例子呢?

#include <stdio.h>

main()
{
    double nc;

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:7)

程序会一直从stdin读取数据,直到收到EOF为止,这可以通过在Unix控制台的行开头按Ctrl-D或按开始时的Ctrl-Z来完成。 Windows控制台中的行。以这种方式发出EOF信号后,将执行printf功能,显示读取的字符数。

答案 2 :(得分:6)

您的nc是双重使用 printf("%lf", nc) 来打印双打。

试试这个

#include <stdio.h>

int main(void)
{
    int nc;

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

    return 0;
}

答案 3 :(得分:5)

我想澄清到目前为止给出的答案,因为他们似乎使用“发送EOF”,“收到EOF”,“EOF字符”等词语。根据评论(谢谢)这个答案,“发送EOF“和”收到的EOF“是合法条款,但请不要认为它是一个角色。

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

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

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

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

答案 4 :(得分:1)

此代码从标准输入中读取字符。正常运行此程序时,标准输入来自用户。在这种情况下,无法将EOF发送到程序。

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

答案 5 :(得分:0)

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