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');
}
相关文章:
- C++中的cin.ignore()函数不适用于整个流
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- Turbo C++ cin() 不能与 gets() 一起使用
- 一起使用 GETS 和 CIN
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 与 CIN 一起使用的 getline() 函数
- 将GoogleTest与通过STD :: CIN从用户输入的函数一起使用
- 如何将 cin>> 与初始化的字符* 一起使用为 NULL
- CIN.IGNORE如何与CIN和Getline一起工作
- <vector> 与 cin 和 for() 循环C++一起使用
- C++:将指针与cin.getline()一起使用
- 如何将 cin 与未知输入类型一起使用
- 将 Getline 与 CIN 一起使用以指定用户输入
- select,std::cin和std::getline在一起打得不好
- getline(cin,string)与cin.ignore()一起不工作