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

jfs*_*jfs 3 c language-lawyer c11

isspace()如果输入可表示为unsigned char或等于,则有效EOF.

getchar() 从stdin读取下一个字符.

getchar()!=EOF; 是否所有getchar()返回的值都可以表示为unsigned char

uintmax_t count_space = 0;
for (int c; (c = getchar()) != EOF; )
  if (isspace(c))
    ++count_space;
Run Code Online (Sandbox Code Playgroud)

愿这段代码导致未定义的行为吗?

jfs*_*jfs 10

根据C11 WG14草案版本N1570:

§7.21.7.6/ 2getchar函数getc与参数stdin 等效.

§7.21.7.5/ 2getc功能相当于fgetc......

§7.21.7.1/ 2 [ !=EOF案例] ...... fgetc函数获得该字符作为unsigned char转换为int......中的文本是我的.

  • isspace()接受getchar()价值观
  • 所有getchar()!=EOF值都可表示为unsigned char
  • 这里没有未定义的行为.

如果你认为它太明显了("它还能做什么"),那就再想一想.例如,在相关的情况下:isspace(CHAR_MIN)可能是未定义的,即,将字符传递给字符分类函数可能是未定义的行为!

如果UCHAR_MAX > INT_MAX结果可能是实现定义的:

§6.3.1.3/ 3否则,新类型已签名,其值无法表示; 结果是实现定义的,或者引发实现定义的信号.