Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getline(cin,string)即使与cin.ignore()一起工作也不工作_C++_Console_Std_Iostream_Getline - Fatal编程技术网

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

C++ getline(cin,string)即使与cin.ignore()一起工作也不工作,c++,console,std,iostream,getline,C++,Console,Std,Iostream,Getline,这个网站上有几个问题是关于getline不工作的,显而易见的解决方案是缓冲区中有剩余的换行字符需要清除,应该是使用cin.ignore()。我已经尝试过这么多的变体,但似乎什么都不起作用,我所做的只是简单的控制台输入,cin>>string不是一个选项,因为字符串可能有空格 这是我的密码 void prompt(std::string * str) { cout << "> "; cin.sync(); cin.get(); cin.ignor

这个网站上有几个问题是关于
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;
}
void提示符(std::string*str)
{

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

我不知道您在中调用
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');
}
#包括
#包括
#包括
//返回bool,以便知道它是否失败
bool提示符(std::string&s)//使用引用
{
std::cout>std::ws,s);
}
int main()
{
字符c;
std::字符串s;
做
{
if(!prompt(s))//始终检查输入
打破
//处理字符串(例如,将其反转…)
std::reverse(s.begin(),s.end());

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

cin.reset();

请不要用C标记来标记C++问题,删除所有的<代码> IGORE()/CUT>命令,使用<代码> STD::GETLIN(STD:CIN >:STD::WS/TMP);<代码> > STD::WS跳过所有空白(包括行的末尾)。我没有看到任何错误检查。{cout@BenVoigt我完全忽略了这一点,而故障位似乎已经设置好了。我该怎么办?@Jake:找出故障位设置的时间,并修复它。如果应该设置它(例如处理格式错误的输入),那么使用
cin.clear()
重置故障位并尝试另一个操作。看起来
getline
调用正在设置failbit@Jake:所以就在
getline
之前,
if(cin)不能打印是的,它们都可以打印,我不知道你的意思,但我不是有意地对文件做任何事情,只是尝试真正读取控制台输入:\