【问题标题】:getline(cin, string) not working EVEN WITH cin.ignore()即使使用 cin.ignore(),getline(cin, string) 也无法正常工作
【发布时间】:2014-11-28 21:46:17
【问题描述】:

这个站点上有几个问题是指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 设置为一个空字符串。请帮忙。感谢您的宝贵时间。

【问题讨论】:

  • 请不要用 C 标签标记 C++ 问题
  • 尝试删除所有ignore() 命令并改用std::getline(std::cin &gt;&gt; std::ws, tmp);&gt;&gt; std::ws 跳过所有空格(包括行尾)。
  • 我没有看到任何错误检查。做if (!cin) { cout &lt;&lt; "Something set the failbit." &lt;&lt; endl; }
  • @BenVoigt 我完全忽略了这样做,看来故障位已设置。我该怎么办?
  • @Jake:找出你的代码中的故障位设置了多远,并修复它。如果应该设置它(例如处理格式错误的输入),则使用cin.clear() 重置故障位并尝试另一个操作。

标签: c++ console std iostream getline


【解决方案1】:

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

cin.reset();

【讨论】:

  • 看起来getline 调用正在设置故障位
  • @Jake:那么就在getlineif (cin) cout &lt;&lt; "Everything is ok" &lt;&lt; endl; 和getline 之后,if (!cin) cout &lt;&lt; "cin is failed" &lt;&lt; endl; 都打印?您是否正在重定向文件中的输入? getline 对输入格式不是很挑剔,我想不出除了流结束还有什么会导致它失败。
  • 是的,它们都是打印的,我不确定你的意思,但我没有(故意)对文件做任何事情,只是试图真正读取控制台输入:\
【解决方案2】:

不鼓励使用指针传递变量。如果您想从函数中取回值,建议使用 &amp;

我不知道您在其中调用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');
}

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2014-03-08
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多