在getline的代码上方使用过cin流来获取过键盘输入时,getline会出现直接跳过。
#include<bits/stdc++.h>
using namespace std;
int mian()
{
int x = 0;
cin >> x;
//cin.ignore();
//cin.sync();
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
这段代码可以如期进行吗?
肯定是不行的,不然我也不会写出来。。。
这时候输入了 x
之后,程序就直接结束了。为啥呢?
因为cin流中还残余了换行符,getline()
就直接读入换行符,然后程序结束。
想要解决这个问题,可以加上第8行注释中的语句,清空cin流,然后就可以正常输入字符串到 str
中了。
cin.ignore(int a = 1, char ch = EOF)
这个函数会忽略 a
个字符,直到字符是 ch
为止。
在这里 cin.sync()
也有同样的功能。
cin流失效
在搜索资料的过程中又发现了cin流失效的问题。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x = 0;
cin >> x; //如果此时输入字母a
cout << "x = " << x << endl;
//cin.clear();
//cin.ignore();
cin >> x;
cout << "x = " << x << endl;
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
如果程序运行到第八行时输入了字母 a ,因为接收字母 a 的变量是 int 类型的,此时cin流会出错, cin.fail() == 1
。cin流会失效后,会直接输出 x = 0
。
此时如果第二个 cin >> x
想要正常输入,则需要将第11,12行中语句加上,cin.clear()
是重置错误标志位,cin.ignore()
是清除一个cin流中的字符。加上这两句后就可以正常输入数字到 x
中了。
推介看看参考4,有非常多具体实例,还讨论了cin.clear()
和 cin.ignore()
的使用先后顺序问题(先使用 cin.clear()
重置错误标志位,然后清空cin缓存区)。
先使用cin.ignore()然后用getline()读入一行,会少一个字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
cin.ignore(5, '\n');
string str;
getline(cin, str);
cout << str << endl;
system("pause");
return 0;
}
这个简单示例,就更进一步演示了 cin.ignore()
的功能,就是忽略cin流中指定数目的字符,直到遇到指定字符。
参考1:link1
参考2:link2
参考3:link3
参考4:link4