在阅读了很多关于跳过getline的主题之后,我仍然无法让我的程序运行起来。
首先我读了用户的输入。应该是" ADD 1"。然后我显示下面的值" ADD"。我再次开始阅读用户的输入,以下getline只是不想读取' ss'由于某些原因,并且命令为空。
以下是代码:
string lecture, command;
getline(cin, lecture);
stringstream ss(lecture);
getline(ss, command, ' ');
while(command.compare("EXIT") != 0) {
if(command.compare("ADD") == 0) {
string id;
getline(ss, id);
cout << id << endl;
}
lecture = "";
command = "";
getline(cin, lecture);
ss.str(lecture);
getline(ss, command, ' ');
}
输入/输出(输出&#34;&gt;&#34;区分):
ADD 1
>1
ADD 2
(From here -> Goes back to getline(cin, lecture))
我不明白我做错了什么? 循环中的第一个getline运行良好,但它只是出错了。 很明显,即使在getline之后命令仍然是空的。但是我不明白为什么会有任何拖尾&#39; \ n&#39;当我在线getline(ss,命令,&#39;&#39;)时,getline会丢弃&#39; \ n&#39;,因此命令应具有新值。
谢谢!
编辑: 有人评论说stringstream.str没有正确重置或者什么,他是对的(为什么你删除了你的答案?!)!我知道在每个循环中重新创建对象stringstream并且它可以工作。我将打开线程,以防有更好的解决方案,而不是重新创建对象。
基本上现在ss是一个指针,在循环的每次迭代中我都这样做:ss = new stringstream(讲座)
答案 0 :(得分:1)
我认为您的ss
不包含endl
并且感到困惑。另一件奇怪的事情是指令ss.str(lecture);
对我的机器没有影响。它可能是一个库bug?无论如何,我在>>
上使用getline
代替ss
,因为ss
可以流入/流出:
string lecture, command;
getline(cin, lecture);
stringstream ss;
ss << lecture << endl;
ss >> command;
while(command.compare("EXIT") != 0) {
if(command.compare("ADD") == 0) {
string id;
ss >> id;
cout << id << endl;
}
lecture = "";
command = "";
getline(cin, lecture);
ss << lecture << endl;
ss >> command;
}
或者,要使用getline()
,我也可以使用它,但有限制,即输入&#34; EXIT&#34;不会退出,你需要键入&#34; EXIT&#34 ;,即在&#34; EXIT&#34;之后输入空格。因为它每次都在命令后寻找空间。 (你的程序中的一个错误)。无论如何,这是getline()
版本:
string lecture, command;
getline(cin, lecture);
stringstream ss(lecture + "\n");
getline(ss, command, ' ');
while(command.compare("EXIT") != 0) {
if(command.compare("ADD") == 0) {
string id;
getline(ss, id);
cout << id << endl;
}
lecture = "";
command = "";
getline(cin, lecture);
ss.str(lecture + "\n");
getline(ss, command, ' ');
}