2014-11-05 106 views
0

在阅读了许多有关getline被跳过的线程之后,我仍然无法让我的程序正常工作。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, ' '); 
} 

和输入/输出(输出用 “>” 来区分):

ADD 1 
>1 
ADD 2 
(From here -> Goes back to getline(cin, lecture)) 

我不明白我在做什么错? 循环中的第一个getline运行良好,但后来出错。 很明显,命令保持空白,即使在getline之后。但是我不明白为什么当getline(ss,command,'')作为getline放弃'\ n'时,为什么会有'\ n'后缀,因此命令应该具有新值。

谢谢!

编辑: 有人评论说stringstream.str不正确或重置的东西,他是正确的(为什么你删除你的答案?!)!我知道在每个循环中重新创建对象字符串流,并且它可以工作。如果有比重新创建对象更好的解决方案,我将保持打开的线程。

基本上现在ss是一个指针,而在环我做的每一次迭代:SS =新的字符串流(讲座)

+0

我看看这个[主题](http://stackoverflow.com/questions/6378662/getline-problem),我不应该有同样的问题我的程序中没有使用任何cin >>,对吧? – 2014-11-05 22:03:24

+0

有人评论说stringstream.str没有正确重设或什么,他是对的(为什么你删除了你的答案?!)!我知道在每个循环中重新创建对象字符串流,并且它可以工作。如果有比重新创建对象更好的解决方案,我将保持打开的线程。 – 2014-11-05 22:15:37

+1

'ss.clear()'应该重置stringstream上的任何错误。没有理由一直新的。如果你需要清除任何剩余的数据,'ss.str(“”);'会做到这一点。 – 2014-11-05 22:25:26

回答

1

我觉得你ss不包括endl是困惑。另一个奇怪的是,指令ss.str(lecture);对我的机器没有影响。这可能是一个图书馆的错误?总之,我使用>>而不是getliness,因为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(),我也使它工作,与限制,即键入“EXIT”将不会退出,您需要输入“EXIT”,即在“EXIT”后面有空格,因为它每次都在查找命令后的空格。 (来自您的程序的错误)。无论如何,这是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, ' '); 
} 
+0

实际上,'ss'不是必需的。 'cin'本身就是一条小溪。因此,对于我的第一个解决方案,只需使用'cin >> command'和'cin >> id'来代替ss做什么。 – 2014-11-07 02:59:36