为什么在C ++ 11中添加了std :: isblank?

时间:2012-10-15 00:04:37

标签: c++ c++11

我注意到在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 ++标准。

3 个答案:

答案 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将isblankiswblank添加到<locale.h>,但<locale>未提供任何等效内容。

我注意到C ++中缺少它的原因,以及我希望它添加的原因是std::regex_traits<char>需要支持"blank"字符类,因此如果C99支持它会更容易isblank函数可用,否则C ++正则表达式实现需要以某种方式识别isspace为真的&#34;特定于语言环境的字符集&#34;。使用isblank解决了问题。