K&R书中的C编程练习

7 c kernighan-and-ritchie

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

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*ten 12

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


Rob*_*ble 7

该计划一直读取从数据中stdin,直到EOF被接收,这是通过在Windows控制台行的开头一个Unix控制台或Ctrl-Z一行的开头按Ctrl-d完成的.EOF以这种方式发出信号后,printf将执行该功能,显示读取的字符数.


Evi*_*ach 6

ncprintf("%lf", nc)打印双打的双重用途.

试试这个

#include <stdio.h>

int main(void)
{
    int nc;

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 5

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

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

它由C标准定义为负数,而getchar将字符作为转换为int的unsigned char返回.

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

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