我目前正在读里奇出版社(Ritchie&克尼根.我对getchar()函数中EOF的用法感到非常困惑.

首先,我想知道为什么EOF的值是-1,为什么getchar()!=EOF的值是0.请原谅我的问题,我真的不明白.我真的试过了,但是我做不到.

然后我试着在书上运行这个例子,可以使用下面的代码计算字符数,但似乎即使我按enter键,我也永远不会跳出循环,所以我想知道什么时候才能到达EOF?

main(){
   long nc;
   nc = 0;
   while (getchar() != EOF)
       ++nc;
   printf("%ld\n", nc);
}

然后,我在Problem with EOF in C岁时读到了同样的问题.大多数人建议不要使用EOF,而使用结束符\n或空结束符‘\0’,这很有意义.

这是否意味着书中的例子还有另一个用途?

推荐答案

EOF表示"文件结束".换行符(当您按Enter键时发生的情况)不是file的结尾,而是line的结尾,所以换行符不会终止这个循环.

代码没有错误[*],只是它没有做您似乎期望的事情.它读到输入的末尾,但是您似乎只想读到行尾.

EOF的值为-1,因为它必须不同于实际字符getchar的任何返回值.因此,getchar以无符号字符的形式返回任何字符值,并将其转换为int,因此int将是非负的.

如果您在终端上键入,并且希望引发文件结束,请使用CTRL-D(unix风格的系统)或CTRL-Z(Windows).然后在读取所有输入后,getchar()将返回EOF,因此getchar() != EOF将为假,循环将终止.

[*]如果由于整数溢出,输入超过了LONG_MAX个字符,那么它有未定义的行为,但在一个简单的例子中,我们可能可以原谅这一点.

C++相关问答推荐

为什么下面的C代码会进入无限循环?

使用单个字节内的位字段

在C语言中使用scanf()时我无法理解的警告

在C中使用动态内存分配找到最小的负数

在函数中使用复合文字来初始化C语言中的变量

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

加密解密工作正常,但返回错误0x80090005

X64:并发写入布尔数组

在创建动态泛型数组时,通过realloc对故障进行分段

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

我在C程序的Flex/Bison中遇到语法错误

不使用任何预定义的C函数进行逐位运算

宏观;S C调深度

与外部SPI闪存通信时是否应禁用中断?

使用mmap为N整数分配内存

初始化动态分配的布尔二维数组的最佳方法是什么?