我正在编译以下程序,并且我了解到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"
。我期望b
和c
都没有值,因为提取应该因为前导空格而失败。这种行为的原因是什么?
答案 0 :(得分:1)
在IOStreams中,字符几乎没有格式要求。字符序列中的任何和所有字符都是提取的有效候选者。对于使用数字构面的提取器,提取被定义为在空白处停止。但是,charT&
的提取程序直接在缓冲区上工作,可能会通过调用rdbuf()->sbumpc()
不加选择地返回下一个可用字符。
不要认为此行为会扩展到指向字符指针的提取器,因为它们的提取被明确定义为在空格处停止。