为什么std :: operator>>(istream&,char&)提取空格?

时间:2014-02-17 04:38:20

标签: c++

我正在编译以下程序,并且我了解到char&的提取器继续提取字符,即使它是一个空白字符。我禁止跳过前导空白字符,期望正在进行的读取尝试失败(因为格式化提取在空白处停止),但是当它成功时却感到惊讶。

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream iss("a b c");
    char a, b, c;

    iss >> std::noskipws;

    if (iss >> a >> b >> c)
    { 
        std::cout <<     "a = \"" << a
                  << "\"\nb = \"" << b
                  << "\"\nc = \"" << c << '\n';
    }
}
  

输出:

a = "a"
b = " "
c = "b"

正如您从输出中看到的那样,b被赋予"a""b"之间的空格值;并且c被赋予以下字符"b"。我期望bc都没有值,因为提取应该因为前导空格而失败。这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

在IOStreams中,字符几乎没有格式要求。字符序列中的任何和所有字符都是提取的有效候选者。对于使用数字构面的提取器,提取被定义为在空白处停止。但是,charT&的提取程序直接在缓冲区上工作,可能会通过调用rdbuf()->sbumpc()不加选择地返回下一个可用字符。

不要认为此行为会扩展到指向字符指针的提取器,因为它们的提取被明确定义为在空格处停止。