我是C编程语言的初学者,最近学习了getchar
函数,它可以从控制台或文件中接受一个字符,边输入边立即显示出来,需要按下Enter键才能继续。
它返回读取的unsigned char
。如果遇到文件结束或错误,getchar()
函数会返回EOF。
我的问题是,当它返回unsigned char
时,为什么它的返回值被存储在int
变量中?
请帮帮我。
正是因为存在EOF值,因为文件中的字符可以是任何可能的字符值,包括C字符串用于终止的空字符,getchar()
必须使用一个更大的整数类型来添加EOF值。
它只是恰好使用int类型来实现这个目的,但它也可以使用任何至少具有9位的类型。
getchar()
返回的值是字符的 unsigned char
值,而不是它的 char
值。 - chux - Reinstate Monica返回类型为int,以容纳特殊值EOF。
EOF是一个宏,它扩展为具有int类型和实现相关的负值的整数常量表达式,但通常为-1。
getchar
函数返回一个int
类型的值,该值:
如果函数成功,则表示流中下一个字符的字符代码,范围在unsigned char
(即非负值)之内;或者
如果函数失败,则表示特殊值EOF
(即负值),以指示失败。
getchar
函数总是返回:
原因是必须能够区分有效字符和特殊值EOF
(表示失败且不是有效字符)。
如果将getchar
函数的int
返回值存储在unsigned char
中,则会丢失信息,并且将无法区分有效字符和特殊值EOF
。
在大多数平台上,EOF
被定义为值-1
,而unsigned char
可以表示范围0
到255
。 在这些平台上,以下情况适用:
函数getchar
可以返回范围在-1
到255
之间的int
值,即有257个可能的值。 范围0
到255
(共256个可能的值)用于有效字符代码,而值-1
用于指示失败(EOF
)。
getchar
的返回值以unsigned char
类型的变量保存,那么您只有256个可能的值,而不是257个。 值-1
将转换为值255
。 这意味着unsigned char
变量无法表示值EOF
,因此您将无法确定getchar
返回了值EOF
还是返回了有效字符代码255
。 值255
可以表示两种含义。getchar
的返回值存储在一个signed char
类型的变量中,你会遇到类似的问题,因为signed char
只能表示256个不同的值,但你需要能够表示257个不同的值。即使signed char
有表示EOF
值的优势,你仍然无法区分EOF
和有效字符,因为值-1
可以同时表示两者。它既可以表示EOF
,也可以表示字符代码为255
的有效字符。getchar
的返回值存储在一个int
类型的变量中。只有确定getchar
没有返回EOF
后,才可以安全地将返回值存储在unsigned char
或signed char
类型的变量中,因为你不再需要区分有效字符和特殊值EOF
。getchar
的返回值存储在 char
中。在某些平台上,char
等同于 signed char
,而在其他一些平台上,char
等同于 unsigned char
。ISO C 标准允许两者并存。
while ((c = getc(file)) != EOF)
循环不会停止执行。 - Jonathan Leffler