isspace()是否接受getchar()值?
如果输入可表示为unsigned char
或等于EOF
则isspace()
有效。
getchar()
从stdin中读取下一个字符。
当getchar()!=EOF
; 所有getchar()
返回的值都可以表示为unsigned char
吗?
uintmax_t count_space = 0; for (int c; (c = getchar()) != EOF; ) if (isspace(c)) ++count_space;
愿这段代码导致未定义的行为吗?
根据C11 WG14草案版本N1570 :
§7.21.7.6/ 2
getchar
函数等效于带有参数stdin的getc
。§7.21.7.5/ 2
getc
函数等同于fgetc
…§7.21.7.1/ 2 [
!=EOF
case] …fgetc
函数获取该字符作为转换为int
的unsigned char
… […]中的文本是我的。
即
-
isspace()
接受getchar()
值 - all
getchar()!=EOF
值可表示为unsigned char
- 这里没有未定义的行为。
如果你认为它太明显了(“它还能做什么”),那就再想一想。 例如,在相关的情况下 : isspace(CHAR_MIN)
可能是未定义的,即,将字符传递给字符分类函数可能是未定义的行为!
如果UCHAR_MAX > INT_MAX
则结果可能是实现定义的:
§6.3.1.3/ 3否则,新类型已签署,其值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。
getchar()
的返回值与fgetc()
格式相同。 C11定义了7.21.7.1p2-3中fgetc()
的返回值:
- 如果未设置stream指向的输入流的文件结束指示符并且存在下一个字符,则
fgetc
函数将该字符作为转换为int
的unsigned char
获取,并为该流提前关联的文件位置指示符(如果定义)。返回
- 如果设置了流的文件结束指示符,或者流位于文件结尾,则设置流的文件结束指示符,并且
fgetc
函数返回EOF
。 否则,fgetc
函数返回stream指向的输入流中的下一个字符。 如果发生读取错误,则设置流的错误指示符,并且fgetc
函数返回EOF
。 [289]
由于这是一个转换为int
的unsigned char
,因此int
几乎总是与unsigned char具有相同的值。
对于sizeof(int) == 1
某些平台上的高值,可能不是这样; 然而,这些主要是DSP平台,因此几乎可以肯定在这些平台上不需要进行字符分类。
is*
函数是经过精心定义的,因此可以直接使用*getc*
C11 7.4p1的返回值:
1头文件
声明了几个对字符分类和映射有用的函数。 [198]在所有情况下,参数都是一个
int
,其值应表示为unsigned char
或者等于宏EOF
的值 。 如果参数具有任何其他值,则行为未定义。
即将EOF
传递给is*
函数是合法的。 当然isanything(EOF)
将始终返回0,因此要计算连续的空白字符,可以简单地使用如下内容:
while (isspace(getchar())) space_count ++;
但是,签名的char值不正常,例如,如果将除EOF
之外的负值传递给任何字符分类函数,则已知MSVC C调试库将中止 。