我目前正在做c ++并且正在经历如何通过字符串接受句子并反转单词(这是一个单词......单词a是这样的等等)
我看过这个方法:
static string reverseWords(string const& instr)
{
istringstream iss(instr);
string outstr;
string word;
iss >> outstr;
while (iss >> word)
{
outstr = word + ' ' + outstr;
}
return outstr;
}
int main()
{
string s;
cout << "Enter sentence: ";
getline(cin, s);
string sret = reverseWords(s);
cout << reverseWords(s) << endl;
return 0;
}
我已经完成了这个功能并且有点理解,但我对于确切地发生了什么感到有点困惑
iss >> outstr;
while (iss >> word)
{
outstr = word + ' ' + outstr;
}
return outstr;
任何人都可以向我解释正在发生的确切过程吗?
非常感谢
答案 0 :(得分:3)
iss是一个istringstream,istringstreams是istreams。
作为一个istream,iss具有operator>>
,它以空白分隔的方式从其字符串缓冲区读取字符串。也就是说,它一次读取一个以空格分隔的标记。
所以,给定字符串“This is a word”,它首先要读的是“This”。它会读到的下一件事是“是”,然后是“a”,然后是“word”。然后就会失败。如果失败,则将iss置于一个状态,如果你将它作为bool测试,它的结果为false。
因此while循环将一次读取一个单词。如果读取成功,则循环体将该单词附加到outtr的开头。如果失败,则循环结束。
答案 1 :(得分:1)
iss 是流,&gt;&gt; 是提取运算符。如果您将流视为连续的数据行,则提取运算符会从此流中删除一些数据。
while 循环一直从流中提取单词,直到它为空(或者只要流可以说是好的)。循环内部用于将新提取的单词添加到 outtr
的末尾答案 2 :(得分:1)
指示:
istringstream iss(instr);
允许在使用instr
时解析operator>>
,将单词空格分开。每次使用运算符>>
时,iss
都会指向instr
存储的短语的下一个单词。
iss >> outstr; // gets the very first word of the phrase
while (iss >> word) // loop to get the rest of the words, one by one
{
outstr = word + ' ' + outstr; // and store the most recent word before the previous one, therefore reversing the string!
}
return outstr;
因此,短语中检索到的第一个单词实际上存储在输出字符串的最后一个位置。然后,从原始字符串中读取的所有后续单词将被放在前一个单词读取之前。