cin没有吃掉回车键
cin在获得输入的时候,需要用户按回车键结束。但是cin并没有管这个回车键,而是把回车键留在了输入流里。
这样当接下来执行getline的时候,getline上来就遇到了cin留下来的回车键。而getline遇到回车就会结束。这导致getline直接退出了。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a = 0;
cin >> a;//第一行:这里输入了1234和回车(光标到下一行)
cout << a << endl;//第二行:这里输出了1234和一个回车(光标到下一行)
string line;
/*下面这里会直接得到cin留下来的回车键而结束,
导致line的内容为空,这不是我们想要的
*/
getline(cin, line);//第三行
cout << line << endl; //这里输出一个回车(光标到下一行)
//第四行
return 0;
}
运行效果:
可以看出getline吃掉了cin留下的回车
可以看到输出和代码注释中的解释一样。
如何解决这种问题呢?
就是不要让cin留一个换行符在输入流里面。执行下面的语句让cin把留下来的回车吃掉。
cin.ignore();//让cin把用户为了输入a而输入的回车吃掉
正确的代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a = 0;
cin >> a;//第一行:这里输入了1234和回车(光标到下一行,第二行)
cin.ignore();//把用户为了输入a而输入的回车吃掉
cout << a << endl;//第二行:这里输出了1234和一个回车(光标到下一行,第三行)
string line;
/*等待用户输入一行内容*/
getline(cin, line);//第三行,这里用户输入了abcdef和一个回车(光标到下一行,第四行)
cout << line << endl; //这里输出abcdef和一个回车(光标到下一行,第5行)
return 0;
}
正确的预期输出
正确的如预期的结果,完美!
注意:有留学生因为这个问题,整个大作业0分。
Ubuntu 环境