为什么用c语言EOF IS -1?

时间:2010-12-31 08:47:42

标签: c

用c语言我正在使用EOF .....为什么EOF是-1?为什么没有其他价值?

5 个答案:

答案 0 :(得分:10)

来自Wikipedia

  

EOF的实际值取决于系统(但通常是-1,例如在glibc中)并且不等于任何有效的字符代码。

它不能是0 - 255中的任何值,因为它们是大多数系统上字符的有效值。例如,如果EOF为0,那么你将无法区分读取0和到达文件末尾的区别。

-1是显而易见的剩余选择。

您可能还想考虑使用feof

  

由于EOF用于报告文件结尾和随机错误,因此通常最好使用feof函数明确检查文件末尾和ferror以检查错误。

答案 1 :(得分:4)

不是。它被定义为实现定义的负int常量。它必须是负数,以便可以轻松地将其与 unsigned char 区分开来。在大多数实现中,它确实是-1,但C标准并不要求这样做。

选择-1的历史原因是字符分类函数(参见< ctype.h>)可以实现为简单的数组查找。它是“最接近”的值,不适合无符号字符。

[更新:] 使字符分类功能高效可能不是首先选择-1的主要原因。我不知道所有的历史细节,但这是最明显的决定。它必须是负数,因为有char类型的机器没有正好8位,所以选择正值将很困难。它必须足够大,以使它不是unsigned char的有效值,但又足够小以适应int。当你必须选择一个负数时,为什么要采用任意大的负数?这使得-1成为最佳选择。

答案 2 :(得分:0)

答案 3 :(得分:0)

int c;

c = getchar();
while(!feof(stdin) && !ferror(stdin)) {
  ...
  c = getchar();
}

您应该小心考虑文件结束或错误对您对这些值所做的任何测试的影响。考虑这个循环,用于扫描所有字符,直到收到的下一个空白字符:

int c;

c = getchar();
while(!isspace(c)) {
  ...
  c = getchar();
}

如果在检测到任何空格之前返回EOF,则此循环可能永远不会终止(因为它不是空格字符)。写这个的更好方法是:

int c;

c = getchar();
while(!feof(stdin) && !ferror(stdin) && !isspace(c)) {
  ...
  c = getchar();
}

最后,值得注意的是,尽管EOF通常为-1,但所有标准承诺都是类型为int的负整数常量。

答案 4 :(得分:0)

您可以轻松更改EOF值。 在C程序中默认定义EOF = -1的宏, 所以你在程序中提到EOF,默认的c编译器为-1分配值;

例如

;

只是你试着得到结果

#include <stdio.h>
#define EOF 22
main()
{
   int a;
   a=EOF;
   printf(" Value of a=%d\n",a);
}

输出:

a = 22的值

原因:

那段时间EOF值改变了