12

我注意到在 C++11 中添加了std::isblank (in <locale>) 和std::isblank (in )。<cctype>我发现这个页面Returns true if c is a blank character; that is, a space or a tab.(对于“C”语言环境),所以空白字符可能是空白字符的子集,但是我不明白区分的原因,因为我们有std::isspace. 为什么被std::isblank添加到标准库中?

更新 根据这里,看起来 POSIX 规范是第一个引入“空白”字符类的,然后 C 和 C++ 标准也随之而来。

4

3 回答 3

11

可能空白字符是空白字符的子集

绝对是一个子集。C99 7.4.1.3/2 说,“标准空白字符或 isspace 为真的特定于语言环境的字符集之一”。

它继续我认为的动机:“那是用来分隔一行文本中的单词”。

isspace对于不用于分隔文本行中的单词的某些字符返回 true 。主要是换行符。

显然,这是指isspaceand isblankin <cctype>,而不是<locale>您所问的 in ,但我认为这没有任何区别。我认为该标准并没有真正明确说明,但两者指的是相同的“字符类型”列表。

于 2012-10-15T00:26:46.543 回答
8

两者都是地区感知的——不同之处在于每个地区的规则,这将是一个太大的列表,无法在此处列举(假设有一个单一的、详尽的列表开始)。

特别感兴趣的是默认的 C 语言环境,其行为如下:

  • isspace返回true空格、换页、换行、回车、水平制表符和垂直制表符。
  • isblank仅返回true空格和水平制表符。
于 2012-10-15T00:16:59.833 回答
4

原因很简单,它在 C 中,因此为了保持一致性,也应该在 C++ 中,正如我在添加它的DR中指出的那样:

C99 添加isblankiswblank<locale.h><locale>不提供任何等效项。

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

于 2012-10-15T11:13:14.940 回答