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)不能打印是的,它们都可以打印,我不知道你的意思,但我不是有意地对文件做任何事情,只是尝试真正读取控制台输入:\