getline()在多次调用后跳过

时间:2014-11-05 21:46:06

标签: c++ whitespace cin getline stringstream

在阅读了很多关于跳过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(讲座)

1 个答案:

答案 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, ' ');
}