首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isspace()是否接受getchar()值?

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

Stack Overflow用户
提问于 2017-11-05 07:07:19
回答 1查看 845关注 0票数 4

如果输入为unsigned char或等于EOF,则可以使用EOF

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

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

代码语言:javascript
复制
uintmax_t count_space = 0;
for (int c; (c = getchar()) != EOF; )
  if (isspace(c))
    ++count_space;

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

EN

回答 1

Stack Overflow用户

发布于 2017-11-05 08:23:25

getchar()的返回值与fgetc()格式相同。C11定义了fgetc()7.21.7.1p2-3中的返回值。

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

返回

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

由于这是一个转换为unsigned charint,所以int几乎总是具有与无符号字符相同的值。

在某些sizeof(int) == 1平台上,高值可能不是这样的;然而,这些平台大多是DSP平台,因此几乎可以肯定,在这些平台上不需要字符分类。

仔细定义了is*函数,以便它们可以直接与*getc* C11 7.4p1的返回值一起使用。

1报头<ctype.h>声明了几个用于分类和映射字符的函数。在所有情况下,该参数都是一个int,其值应表示为unsigned char应等于宏的值。如果该参数具有任何其他值,则该行为是未定义的。

也就是说,将EOF传递给is*函数是合法的。当然,isanything(EOF)总是返回0,因此,要计算连续空格字符,只需使用以下内容:

代码语言:javascript
复制
while (isspace(getchar())) space_count ++;

但是,符号字符值不确定,例如,如果将EOF以外的负值传递给任何字符分类函数,则MSVC调试库将中止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47119083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档