c++ - getline(cin, string) 即使使用 cin.ignore() 也不起作用

标签 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 设置为空字符串。请帮忙。感谢您的宝贵时间。

最佳答案

一旦任何格式化提取失败,将在您的流上设置 failbit,以后的操作将什么都不做。这有点方便,因为您可以分组处理错误,而不是在每个操作之后检查。但是一旦检测到错误,就需要重置故障位以尝试不同的方法。执行此操作的命令非常简单:

cin.reset();

关于c++ - getline(cin, string) 即使使用 cin.ignore() 也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185641/

相关文章:

c++ - 用作一维的多维 vector 的迭代器?

c++ - 如何使用模板为 "using"声明 "std::array"

c++ - 在构造函数中将一个成员分配给另一个成员是否合法?

javascript - 数组显示为空,但它包含值

hadoop - 无法在Google云的端口22上连接虚拟机

c# - .Net 中的控制台问题

c++ - 可以使用 boost::threads 中的 std::this_thread* 函数吗?

c++ - FLTK g++ 编译错误

c++ - 枚举前向声明与头文件

c++ - std::array 不再发生初始化程序语法错误