我注意到在C ++ 11中添加了std::isblank(在<locale>
)和std::isblank(在<cctype>
中)。我发现这个page表示Returns true if c is a blank character; that is, a space or a tab.
(对于&#34; C&#34;语言环境),所以空白字符可能是空格字符的子集,但是我不明白它的原因。区别,因为我们有std::isspace
。为什么std::isblank
被添加到标准库中?
更新 根据{{3}},看起来POSIX规范是第一个引入&#34;空白&#34;字符类,然后是C和C ++标准。
答案 0 :(得分:10)
可能空白字符是空白字符的子集
绝对是一个子集。 C99 7.4.1.3/2说,“标准空白字符或是一个 一个特定于语言环境的字符集,其中isspace为真“。
它继续我认为的动机:“而且这已经习惯了 在一行文字中单独的单词“。
isspace
对于不用于分隔文本行中的单词的某些字符返回true。主要是,换行。
显然,这指的是isspace
中的isblank
和<cctype>
,而不是<locale>
中的{{1}},但我认为这没有任何区别。我不认为标准真正使它明确,但两者引用相同的“字符类型”列表。
答案 1 :(得分:6)
两者都是区域设置感知的 - 区别在于每个区域设置的规则,这里列举的列表太大(假设有一个详尽的列表可以开始)。
特别感兴趣的是默认的C语言环境,其行为如下:
isspace
返回true
表示空格,换页,换行,回车,水平标签和垂直标签。isblank
仅针对空格和横向标签返回true
。答案 2 :(得分:4)
原因很简单,它在C中,所以一致性也应该在C ++中,正如我在添加它的DR中所提到的那样:
C99将
isblank
和iswblank
添加到<locale.h>
,但<locale>
未提供任何等效内容。
我注意到C ++中缺少它的原因,以及我希望它添加的原因是std::regex_traits<char>
需要支持"blank"
字符类,因此如果C99支持它会更容易isblank
函数可用,否则C ++正则表达式实现需要以某种方式识别isspace
为真的&#34;特定于语言环境的字符集&#34;。使用isblank
解决了问题。