繁体   English   中英

getline(cin,string)即使与cin.ignore()一起也不起作用

[英]getline(cin, string) not working EVEN WITH cin.ignore()

这个站点上有几个关于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设置为空字符串。 请帮忙。 感谢您的时间。

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

cin.reset();

不建议使用指针传递变量。 如果要从函数引用中获取值&则建议&

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM