EOF
是否总是负数?
我正在考虑编写一个函数,该函数读取输入中的下一个单词并返回找到单词的行号,如果已经到达输入的结尾,则返回EOF
。如果EOF
不一定是负数,则该函数将不正确。
EOF
永远等于EOF
。不要假设其他任何东西。
在第二次阅读标准时(并根据这里的一些其他评论),似乎EOF
始终为负数-对于本问题中指定的用途(行号或EOF
),它将起作用。我想警告的是(并且仍然是)假定字符为正数而EOF
为负数。
请记住,符合标准的C实现可以具有负字符值-甚至在“C编程语言”(K&R)中提到过这一点。打印字符始终为正数,但在某些体系结构(可能是所有古代的),控制字符为负。 C标准未指定char
类型是有符号还是无符号,并且保证跨平台具有相同值的唯一字符常量是'\0'
。
'\1'
,'\2'
,'\3'
... '\x1'
,'\x2'
也具有相同的跨平台值,以及L'...'
,u'...'
,U'...'
变体。 - chux - Reinstate Monica是的,EOF始终为负数。
标准规定:
7.19 输入/输出
7.19.1 引言3 这些宏是:[...] EOF,该宏扩展为一个整型常量表达式,具有int类型和负值,由多个函数返回,表示文件结尾,即从流中没有更多输入;
请注意,“普通”char
被视为带符号的没有任何问题。<stdio.h>
处理char
的函数会将字符强制转换为unsigned char
类型,然后转换为int
类型,因此所有有效字符都具有正值。例如:
int fgetc(FILE *stream)
7.19.7.1
... fgetc函数将该字符作为无符号字符转换为int获取...
sizeof(char) == sizeof(int)
,那么就存在一个问题,即使通过unsigned char
进行强制转换也不能保证所有有效的char值都是正数。幸运的是,这种情况相对较少发生。 - CB Baileyif (ch < 0) /* EOF detected */;
),或者"执行字符集"使用了从INT_MIN
到0
的所有值时,才会出现这个问题,在这种情况下,EOF
值与有效字符的值相同。 - pmg让该函数返回:
这样问题就解决了,不需要依赖任何EOF值。调用者可以轻松测试是否成功调用,并假定EOF/IO错误。
EOF(End of File)
它是一个带有负值的整数常量表达式,其类型为 int,在多个函数中返回以表示文件结束,即没有流中的更多输入;
EOF 始终是负数,尽管它可能不是 -1。
对于这样的问题,我更喜欢通过将错误条件和数据分离来返回错误代码(如 SUCCESS
、END_OF_FILE
、READ_ERROR
等)作为函数的返回值,然后将感兴趣的数据写入单独的参数,例如:
int getNextWord (FILE *stream, char *buffer, size_t bufferSize, int *lineNumber)
{
if (!fgets(buffer, bufferSize, stream))
{
if (feof(stream)) return END_OF_FILE; else return READ_ERROR;
}
else
{
// figure out the line number
*lineNumber = ...;
}
return SUCCESS;
}
EOF是一种状态,而不是一个值。这个哨兵的确切值是由实现定义的。在很多情况下,它是一个负数。
来自维基百科:
EOF 的实际值是一个与系统相关的负数,通常为 -1,保证不等于任何有效字符代码。
但没有参考资料...
来自安全编码:检测和处理输入输出错误 当sizeof(int) > sizeof(char)时,EOF 为负数。
(f)getc
的返回值是下一个字符被转换为无符号字符,然后转换为int
,而且这个值不应该与EOF
匹配。当然,这只有在sizeof(int) != sizeof(char)
的情况下才能起作用。 - CB Bailey