我发现有这个代码可以将字符串切成单词。我无法弄清楚 while 部分是如何工作的。它如何知道将没有空格的单词提取到 buf 变量中?似乎提取运算符 (>>) 既用于将位推进到缓冲区中,又用于为循环返回 true - 我只是无法弄清楚它如何知道通过空格剪切单词。
string buf; // Have a buffer string
stringstream ss(str); // Insert the string into a stream
vector<string> tokens; // Create vector to hold our words
while (ss >> buf)
tokens.push_back(buf);
我只是不知道它是如何知道用空格剪切单词的
由于buf
的类型是 std::string
,您需要阅读左侧std::istream
和右侧std::string
的operator>>
描述。
引用 cppreference.com
提取字符并将其附加到
str
,直到:读取
N
个字符,如果is.width() > 0
则N
is.width()
,否则N
str.max_size()
,从
is
读取EOF标记,或
isspace(c,is.getloc())
对于is
中的下一个角色也是如此。
最后一句用英语说,"如果下一个字符是空格,则停止"
这是std::operator>>
,而不是按位运算符,用于提取格式化数据,在本例中为 std::string
。它返回对正在读取的流的引用。
一个stringstream
可以在布尔上下文中使用,因为它的转换operator void*()
,允许它用作循环中的终止条件。