getline函数的意外行为

时间:2014-02-19 21:22:23

标签: c++

我的程序中有这个循环,它将一个电话号码作为字符串读取:

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,则不会捕获带有空格的电话号码。

2 个答案:

答案 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;