C-输入正确的代码,但未收到输出

C-输入正确的代码,但未收到输出,c,windows,codeblocks,C,Windows,Codeblocks,当我运行下面的代码并输入一个句子时,我没有得到任何输出。光标刚好移到新行 我直接从书中抄袭了这篇文章,并仔细检查了kernighan&ritchie的第一版C编程语言的错误 #include <stdio.h> int main() { int c,i,nwhite,nother; int ndigit[10]; nwhite=nother=0; for(i=0;i<10;++i) ndigit[i] = 0; while (( c=getchar()) != E

当我运行下面的代码并输入一个句子时,我没有得到任何输出。光标刚好移到新行

我直接从书中抄袭了这篇文章,并仔细检查了kernighan&ritchie的第一版C编程语言的错误

#include <stdio.h>
int main()

{
int c,i,nwhite,nother;
int ndigit[10];

nwhite=nother=0;
for(i=0;i<10;++i)
    ndigit[i] = 0;

while (( c=getchar()) != EOF)
    if(c>= '0' && c<= '9')
        ++ndigit[c-'0'];
    else if (c==' ' || c == '\n' || c == '\t')
        ++nwhite;
    else
        ++nother;

printf("digits =");
for( i=0; i<10; ++i)
    printf("%d",ndigit[i]);
printf(", white space = %d, other = %d\n", nwhite,nother);

return 0;
}

由于您正在测试从另一个源复制的程序,我想您不想更改它,而是想理解它

getchar从标准输入中恰好获得1个字符,这是标准头中名为stdin的文件

标准输入stdin被视为一个文件。 从形式上讲,文件结尾是一个标记,而不是一个字符。 但是,一般情况下,使用特定字符来标记文本文件的文件结尾。 在Windows中,文件结尾标记是字符CTRL-Z,其ASCII代码为26。 在Linxu中,标记为CTRL-D,其ASCII代码为4

另一方面,标准输入通常具有以下行为:

等待用户输入字符,直到按下介绍/输入键。 如果用户未按Enter键,则标准输入不会将控件返回给程序。即使输入文件结尾字符(例如CTRL-Z),也会发生这种情况。 然而,其他行为也是可能的。 例如,在Ubuntu控制台中,我可以在不等待按下Enter键的情况下识别CTRL-D

在任何情况下,都必须在系统控制台中明确键入文件结束标记。 因此,您必须自己按CTRL-Z键,然后按Enter键或CTRL-D键

关于输入和EOF

按下Enter键后,程序将测试EOF,即系统中的文件结束标记。 但是,Enter关键字不打印文件结尾标记,而只打印与标准字符换行符“\n”相对应的行尾标记

因此,如果希望while循环在按下Intro/Enter后终止,则必须针对“\n”而不是EOF进行测试

观察

可以观察到,getchar没有检索字符CTRL-Z,因为CTRL-Z的ASCII码是26,但getchar通常检索负值-1。 这意味着getchar将字符ASCII 26识别为文件结束标记,然后将其转换为宏EOF(不是26)提供的具有C含义的值

我的意思是,EOF不是CTRL-Z,因此,在假定ASCII 26 CTRL-Z将被发送到文本文件的情况下,不能天真地发送EOF

总之,我认为重要的是要阐明文件结尾的抽象概念、EOF的作用以及标记和字符之间的区别。 另一个示例:在Windows中,行尾标记是两个字符CTRL-M CTRL-J,这不仅是1个字符,而且是2个字符

引用标准:

getchar函数返回由指向的输入流中的下一个字符 斯丁。如果流位于文件末尾,则设置流的文件末尾指示符并 getchar返回EOF。如果发生读取错误,则设置流的错误指示器并 getchar返回EOF


我直接从书上抄了下来,仔细检查了错误,我认为克尼汉和里奇可能缩进了…输入一个句子,我没有得到任何输出。你用EOF结束你的句子了吗?依赖操作系统,但Ctrl+D/Ctrl+Z?getchar应该在获取每个字符后自动发送EOF。。。没有S@user3689367,不,使用CTRL+Z,您不可以在IDE或调试器下单步执行它吗?我从不只是把一些代码放进去,期望它能工作。