我想标记输入中的所有单词。
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string line,word;
stringstream ss;
while (1) {
getline(cin,line);
if (line=="#") break;
ss.str(line);
cout << "Stringstream string: " << ss.str() << endl;
while (getline(ss,word,' ')) {
if (word.size()>0) cout << word << endl;
}
cout << "Last Word: " << word << endl;
}
return 0;
}
但是当我对下面的输入执行上面的代码时,getline在下一次迭代中不起作用:
ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries
#
答案 0 :(得分:0)
如果仅为输入的每一行创建一个新的字符串流,则不必担心其状态或到达输入结束后清除任何标志:
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main()
{
string line;
while (getline(cin,line)) {
if (line=="#") break;
stringstream ss(line);
cout << "Stringstream string: " << ss.str() << '\n';
string word;
while (getline(ss,word,' ')) {
if (word.size()>0) cout << word << '\n';
}
cout << "Last Word: " << word << '\n';
}
return 0;
}
在您的代码中,所有行都使用相同的字符串流,但是在第一行ss
的末尾已到达输入结尾,并且变得无用,从而拒绝执行任何操作。
答案 1 :(得分:-1)
您正在阅读,直到设置了ss.eof
。 ss.str
不会取消设置它,因此ss.eof
会在第一次迭代后保持设置状态。
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string line,word;
stringstream ss;
while (1) {
getline(cin,line);
if (line=="#") break;
ss.clear();
ss.str(line);
cout << "Stringstream string: " << ss.str() << endl;
while (getline(ss,word,' ')) {
if (word.size()>0) cout << word << endl;
}
cout << "Last Word: " << word << endl;
}
return 0;
}
使用clear
可以取消设置标志。