cin.clear()
与 cin.sync()
cin.clear()
用来更改cin的状态标示符
cin.sync()
用来清除缓存区的数据流
如果标示符没有改变那么即使清除了数据流也无法输入,所以两个要联合起来使用
cin.ignore(a,ch)
输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。
它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
示例代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int x;
char str[80];
cout << "Enter a number and a string:\n";
cin >> x;
cin.getline(str,80); //take a string
cout << "You have entered:\n";
cout << x << endl;
cout << str << endl;
return 0;
}
输入
8
hahaha
输出
Enter a number and a string:
8
You have entered:
8
整数和字符串有两个cin
语句,但只取数字。当我们按下回车键时,它会跳过 getline()
函数而不接受任何输入。有时它可以接受输入但在整数变量的缓冲区内,所以我们看不到字符串输出。
现在为了解决这个问题,我们将使用 cin.ignore()
函数。
cin.sync()
和cin.ignor()
的比较
sync()的作用就是清除输入缓冲区。成功时返回0,失败时badbit会置位,函数返回-1. 另外,对于绑定了输出的输入流,调用sync(),还会刷新输出缓冲区。
但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。
cin.ignore(numeric_limits<std::streamsize>::max(),' /n'); //清除当前行
cin.ignore(numeric_limits<std::streamsize>::max()); //清除cin里所有内容
不要被长长的名字吓倒,numeric_limits\<std::streamsize\>::max()
不过是climits
头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
使用ignore
显然能比sync()
更精确控制缓冲区。