getline(cin,string)无法正常使用cin.ignore()

时间:2014-10-03 19:38:34

标签: c++ console std iostream getline

本网站上有几个问题提到getline无法正常工作,明显的解决方案是缓冲区中还有剩余的换行符需要清除,假设cin.ignore()。我尝试了很多这方面的变化,似乎没有任何效果,我试图做的只是简单的控制台输入,cin >> string不是一个选项,因为字符串可能有空格。

这是我的代码。

void prompt(std::string * str)
{
    cout << "> ";

    cin.sync();
    cin.get();
    cin.ignore(256, '\r');
    cin.ignore(256, '\n');
    cin.ignore();
    cin.ignore();

    std::string tmp;
    getline(cin, tmp);

    cin.sync();
    cin.get();
    cin.ignore(256, '\r');
    cin.ignore(256, '\n');

    *str = tmp;
}

正如你所看到的,我已经尝试过各种各样的事情。它仍会跳过getline(cin,tmp),似乎将str设置为空字符串。请帮忙。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

一旦任何格式化提取失败,将在您的流上设置failbit,并且将来的操作根本不会执行任何操作。这有点方便,因为您可以处理组中的错误,而不是在每次操作后检查。但是一旦检测到错误,您需要重置failbit以尝试不同的方法。执行此操作的命令非常简单:

cin.reset();

答案 1 :(得分:0)

不鼓励使用指针传递变量。如果您希望从函数中获取值,则建议引用&

我不知道您呼叫prompt()的上下文,但这里有一个实施prompt()的建议,可能对您有用。

#include <algorithm>
#include <iostream>
#include <string>

// return bool so you know if it failed or not
bool prompt(std::string& s) // use reference
{
    std::cout << "> ";
    return std::getline(std::cin >> std::ws, s);
 }

int main()
{
    char c;
    std::string s;

    do
    {
        if(!prompt(s)) // always check the imput
            break;

        // process the string (reverse it for example...)
        std::reverse(s.begin(), s.end());
        std::cout << "reversed: " << s << '\n';

        std::cout << "Another go? [y/n]: ";
    }
    while(std::cin.get(c) && std::tolower(c) == 'y');
}