问题与标题相同,当对字符串使用提取运算符“>>”时
" Hello World"
有 3 个前导空白字符,在“Hello”之后也有空白,在“World”一词之后是字符串的结尾,所以我的问题是提取运算符如何知道它是否是前面的空白,非- 前面的空格以及它是否是字符串的结尾?
“字符串结尾”具体是如何表示的,我们如何在底层知道它?
读取操作符“std::basic_istream
由于这里的操作数是 basic_istream(我不确定),因此它对应于第 17 个描述,即“调用 func(*this),其中 func 是一个 I/O 操纵器”。这是什么意思 ?我该如何解释这个?
istringstream ss(s);
string word;
while(ss>>word)
{
// do something
}
其实并不复杂,基本算法在 cppreference 上有描述 https://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt
一个基本的实现(毫无疑问有很多错误和缺失的功能)看起来像这样:
#include <sstream>
#include <iostream>
std::istream& read(std::istream& is, std::string& str)
{
while (std::isspace(is.peek()))
{
is.get();
}
str.erase();
while (is)
{
auto c = is.peek();
if (c == std::char_traits<char>::eof() || std::isspace(c))
{
break;
}
str.append(1, is.get());
}
return is;
}
int main()
{
std::stringstream ss(" Hello World");
std::string word;
while (read(ss, word))
{
std::cout << "'" << word << "'\n";
}
}