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

Why does std::operator>>(istream&, char&) extract whitespace?

本文关键字:gt 提取 char 空格 std operator 为什么 istream      更新时间:2023-10-16

我正在编译以下程序,我了解到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根本没有值,因为由于前导空格,提取应该失败。这种行为的原因是什么?

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

不要假定此行为扩展到指向字符的指针的提取器,因为它们的提取显式定义为在空格处停止。