getline(cin,string)与cin.ignore()一起不工作

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

本文关键字:cin 一起 工作 ignore string getline      更新时间:2023-10-16

这个网站上有几个问题涉及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');
}