isspace()是否接受getchar()值?

如果输入可表示为unsigned char或等于EOFisspace()有效。

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函数获取该字符作为转换为intunsigned 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()的返回值:

  1. 如果未设置stream指向的输入流的文件结束指示符并且存在下一个字符,则fgetc函数将该字符作为转换为intunsigned char获取,并为该流提前关联的文件位置指示符(如果定义)。

返回

  1. 如果设置了流的文件结束指示符,或者流位于文件结尾,则设置流的文件结束指示符,并且fgetc函数返回EOF 。 否则, fgetc函数返回stream指向的输入流中的下一个字符。 如果发生读取错误,则设置流的错误指示符,并且fgetc函数返回EOF 。 [289]

由于这是一个转换为intunsigned 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调试库将中止