c语言中关于EOF的问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 17:08:49
#include <stdio.h>
#include <stdlib.h>

int main()
{
int cc=0;
for(;getchar()!=EOF;++cc);
printf("%d",cc);

system("PAUSE");
}
程序目的是输出字符数目
测试如下:(ctrl+Z即显示^z:是跳出循环)
输入如下:
123\n^z
字符数目是4

\n^z
字符数目是1

^z
字符数目是0

但是让我困惑的是 为什么输入 123^z就 没有跳出循环输出字符数目呢?
况且只有这种情况下 才没有考虑'\n'这个字符的影响,输出真正的数目。

应该是与stdin流的行缓冲的具体实现有关,具体我也不清楚。
测试打123^Z456\n后,只读入123,不读入^z及其后的456\n,但其中只有按下\n才开始由getchar()读这些字符,之前只是存入行缓冲之中。但此时getchar()并不返回EOF,到下面再单独一行打^Z才返回EOF。
因此推断只有在行首的^Z才直接转换为EOF,而不在行首的^Z的作用只是忽略本行直到换行符的所有字符。

如果把stdin重定向为一个磁盘文件,就没问题了。

"在行首的^Z才直接转换为EOF,而不在行首的^Z的作用只是忽略本行直到换行符的所有字符。"

楼主按照楼上的话理解就行了