[英]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.