如果输入为unsigned char或等于EOF,则可以使用EOF。
getchar()从stdin读取下一个字符。
当getchar()!=EOF;所有getchar()返回的值都可以表示为unsigned char时
uintmax_t count_space = 0;
for (int c; (c = getchar()) != EOF; )
if (isspace(c))
++count_space;这段代码会导致未定义的行为吗?
发布于 2017-11-05 08:23:25
getchar()的返回值与fgetc()格式相同。C11定义了fgetc()在7.21.7.1p2-3中的返回值。
fgetc函数作为转换为int的unsigned char获得该字符,并为该流提升相关的文件位置指示符(如果定义的话)。返回
fgetc函数返回EOF。否则,fgetc函数将从按流指向的输入流返回下一个字符。如果发生读取错误,则设置流的错误指示符,fgetc函数返回EOF。289由于这是一个转换为unsigned char的int,所以int几乎总是具有与无符号字符相同的值。
在某些sizeof(int) == 1平台上,高值可能不是这样的;然而,这些平台大多是DSP平台,因此几乎可以肯定,在这些平台上不需要字符分类。
仔细定义了is*函数,以便它们可以直接与*getc* C11 7.4p1的返回值一起使用。
1报头
<ctype.h>声明了几个用于分类和映射字符的函数。在所有情况下,该参数都是一个int,其值应表示为unsigned char或应等于宏的值。如果该参数具有任何其他值,则该行为是未定义的。
也就是说,将EOF传递给is*函数是合法的。当然,isanything(EOF)总是返回0,因此,要计算连续空格字符,只需使用以下内容:
while (isspace(getchar())) space_count ++;但是,符号字符值不确定,例如,如果将EOF以外的负值传递给任何字符分类函数,则MSVC调试库将中止。
https://stackoverflow.com/questions/47119083
复制相似问题