为什么用于保存getchar返回值的变量必须声明为int?

41zrol4v  于 2023-04-05  发布在  其他
关注(0)|答案(4)|浏览(158)

我是C语言的初学者,最近我学习了getchar函数,该函数将从控制台或文件中接收字符,并在键入时立即显示该字符,我们需要按Enter键继续。
它返回它们读取的unsigned char。如果遇到文件结束或错误,getchar()函数返回EOF。
我的问题是,当它返回unsigned char时,为什么它的返回值存储在int变量中?
请帮帮我。

fdx2calv

fdx2calv1#

因为文件中的char可以是任何可能的char值,包括C字符串用于终止的null字符,所以getchar()必须使用更大的整数类型来添加EOF值。
它只是碰巧使用int来实现这个目的,但它可以使用任何至少9位的类型。

vsmadaxz

vsmadaxz2#

返回类型为int以适应特殊值EOF。
EOF是一个宏,它扩展为一个整型常量表达式,类型为int,并且是一个依赖于实现的负值,但通常是-1。

mnowg1ta

mnowg1ta3#

阅读此链接:link
这里写着:
如果字符I/O函数返回的值将与EOF进行比较,则不要将该值转换为char。一旦这些函数的返回值转换为char类型,字符值可能与EOF无法区分。此外,如果sizeof(int)== sizeof(char),则用于捕获返回值的int可能与EOF无法区分。参见FIO 35-C。使用feof()和ferror()来检测sizeof(int)== sizeof(char)时的文件结束和文件错误。有关sizeof(int)== sizeof(char)时的详细信息,请参阅STR 00-C。有关正确使用字符类型的详细信息,请参阅STR 00-C。
此规则适用于所有字符I/O函数的使用。

jtoj6r0c

jtoj6r0c4#

函数getchar返回一个

  • 如果函数成功,则表示unsigned char范围内的流上的下一个字符的字符代码(即非负值),或者
  • 如果函数失败,则表示特殊值EOF(其为负值)以指示失败。

getchar总是返回的原因

  • 有效字符的非负数,以及
  • 负数表示失败,

必须能够区分有效字符和特殊值EOF(表示失败,不是有效字符)。
如果您将getcharint返回值存储在unsigned char中,那么您将丢失信息,并且不再能够区分有效字符和特殊值EOF
在大多数平台上,EOF被定义为值-1unsigned char可以表示范围0255。在这些平台上,以下内容适用:
函数getchar可以返回一个int值,其范围为-1255,这是257个可能的值。范围0255(这是256个可能的值)用于有效的字符代码,值-1用于指示失败(EOF)。
如果将getcharint返回值存储在unsigned char类型的变量中,那么你将只有256个而不是257个可能的值。值-1将被转换为值255。这意味着unsigned char变量无法表示值EOF,并且您将无法再判断getchar是否返回值EOF或它是否返回值EOF。返回了有效的字符代码255。值255可能意味着两者。
如果将getchar的返回值存储在类型为signed char的变量中,您将遇到类似的问题,因为signed char也只能表示256不同的值,但是你需要能够表示257不同的值。即使signed char具有能够表示值EOF的优点,您仍然会遇到无法将EOF与有效字符区分开的问题,因为值-1可能意味着两者。它可能意味着EOF,也可能意味着字符代码为255的有效字符。
因此,您应该始终首先将getchar的返回值存储在int类型的变量中。只有在确定getchar没有返回EOF之后,才可以安全地将返回值存储在unsigned charsigned char类型的变量中。因为你不再需要从特殊值EOF中区分有效字符。
这同样适用于将getchar的返回值存储在char中。在某些平台上,char等效于signed char,而在其他一些平台上,char等效于unsigned char。ISO C标准允许两者。

相关问题