我是C语言的初学者,最近我学习了getchar函数,该函数将从控制台或文件中接收字符,并在键入时立即显示该字符,我们需要按Enter键继续。它返回它们读取的unsigned char。如果遇到文件结束或错误,getchar()函数返回EOF。我的问题是,当它返回unsigned char时,为什么它的返回值存储在int变量中?请帮帮我。
getchar
unsigned char
getchar()
int
fdx2calv1#
因为文件中的char可以是任何可能的char值,包括C字符串用于终止的null字符,所以getchar()必须使用更大的整数类型来添加EOF值。它只是碰巧使用int来实现这个目的,但它可以使用任何至少9位的类型。
vsmadaxz2#
返回类型为int以适应特殊值EOF。EOF是一个宏,它扩展为一个整型常量表达式,类型为int,并且是一个依赖于实现的负值,但通常是-1。
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函数的使用。
jtoj6r0c4#
函数getchar返回一个
EOF
getchar总是返回的原因
必须能够区分有效字符和特殊值EOF(表示失败,不是有效字符)。如果您将getchar的int返回值存储在unsigned char中,那么您将丢失信息,并且不再能够区分有效字符和特殊值EOF。在大多数平台上,EOF被定义为值-1,unsigned char可以表示范围0到255。在这些平台上,以下内容适用:函数getchar可以返回一个int值,其范围为-1到255,这是257个可能的值。范围0到255(这是256个可能的值)用于有效的字符代码,值-1用于指示失败(EOF)。如果将getchar的int返回值存储在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 char或signed char类型的变量中。因为你不再需要从特殊值EOF中区分有效字符。这同样适用于将getchar的返回值存储在char中。在某些平台上,char等效于signed char,而在其他一些平台上,char等效于unsigned char。ISO C标准允许两者。
-1
0
255
signed char
256
257
char
4条答案
按热度按时间fdx2calv1#
因为文件中的char可以是任何可能的char值,包括C字符串用于终止的null字符,所以
getchar()
必须使用更大的整数类型来添加EOF值。它只是碰巧使用int来实现这个目的,但它可以使用任何至少9位的类型。
vsmadaxz2#
返回类型为int以适应特殊值EOF。
EOF是一个宏,它扩展为一个整型常量表达式,类型为int,并且是一个依赖于实现的负值,但通常是-1。
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函数的使用。
jtoj6r0c4#
函数
getchar
返回一个unsigned char
范围内的流上的下一个字符的字符代码(即非负值),或者EOF
(其为负值)以指示失败。getchar
总是返回的原因必须能够区分有效字符和特殊值
EOF
(表示失败,不是有效字符)。如果您将
getchar
的int
返回值存储在unsigned char
中,那么您将丢失信息,并且不再能够区分有效字符和特殊值EOF
。在大多数平台上,
EOF
被定义为值-1
,unsigned char
可以表示范围0
到255
。在这些平台上,以下内容适用:函数
getchar
可以返回一个int
值,其范围为-1
到255
,这是257个可能的值。范围0
到255
(这是256个可能的值)用于有效的字符代码,值-1
用于指示失败(EOF
)。如果将
getchar
的int
返回值存储在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 char
或signed char
类型的变量中。因为你不再需要从特殊值EOF
中区分有效字符。这同样适用于将
getchar
的返回值存储在char
中。在某些平台上,char
等效于signed char
,而在其他一些平台上,char
等效于unsigned char
。ISO C标准允许两者。