1

我有这段代码,我发现它可以将字符串切成单词。我无法弄清楚 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);
4

2 回答 2

5

我只是想不通它是如何知道用空格切割单词的

由于的类型bufstd::string,您需要阅读它的描述,operator>>左边std::istream是 a std::string,右边是 a。

引用cppreference.com

字符被提取并附加到str,直到:

N读取字符,如果是N,否则是,is.width()is.width() > 0Nstr.max_size()

从 中读取 EOF 标记is,或

isspace(c,is.getloc())中的下一个字符为真is

最后一个子句用英语说,“如果下一个字符是空格,则停止”

于 2012-06-28T21:25:53.570 回答
4

也就是说std::operator>>,不是按位运算符,而是用于提取格式化数据,在这种情况下是 a std::string。它返回对正在读取的流的引用。

由于它的转换, Astringstream可以在布尔上下文中使用operator void*(),允许它用作循环中的终止条件。

于 2012-06-28T21:10:16.783 回答