我的程序中有这个循环,它将一个电话号码作为字符串读取:
while (loop) {
cout << "Telefone (0 para sair):" << endl;
string phone;
getline(cin, phone);
// .. some logic
while (loop2) {
// .. more logic
getline(cin, option);
// .. more logic
}
}
当循环结束逻辑并返回开始时,它不会再次请求电话。它只是再次通过逻辑。有任何想法吗?
如果我使用了cin >> phone
,则不会捕获带有空格的电话号码。
答案 0 :(得分:2)
您声称以下循环不要求phone
输入,这高度表明std::getline()
由于前导空格而无法生成字符。我怀疑你在实际代码中执行了一些格式化提取,在流中留下了换行符。未格式化的提取器std::getline()
在获取换行符时划分输入,这就是您遇到此行为的原因。
这个问题的解决方案总是明确领先的空白。这是使用操纵器std::ws
:
std::getline(std::cin >> std::ws, phone);
// ^^^^^^^^^^^^^^^^^^^
注意:我在答案here中详细讨论了这一点。
您还应该检查您的输入是否成功。这意味着将提取括在if
语句中,以便您可以确定它是否成功生成了字符:
if (std::getline(std::cin >> std::ws, phone))
{
// ...
}
答案 1 :(得分:0)
在尝试再次输入之前,您可能需要使用cin.clear()或cin.ignore()。
更多解释:
这仅仅取决于我的经验,但根据jrok的说法:getline() does not work if used after some inputs
&#34;提取操作留下尾随&#39; \ n&#39;流中的字符。另一方面,istream :: getline()丢弃它。因此,当您在提取运算符后调用getline时,&#39; \ n&#39;是它遇到的第一个角色,它在那里停止阅读。在getline调用提取之前放置它:cin.ignore()&#34;