问题
最近在学习一段简单程序的时候,由于教学视频已经有些年头,出现了一个关于cin.sync()的使用问题。
先看我的代码
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void)
{
int a;
int b;
cout << "请输入一个整数" << endl;
cin >> a;
if (cin.fail()) {
cout << "输入类型错误,请重新输入" << endl;
cin.clear(); // 清除错误标志
cin.sync(); // 清除缓存中的数据
}
cout << "请输入一个整数" << endl;
cin >> b;
if (cin.fail()) {
cout << "输入类型错误,请重新输入" << endl;
cin.clear(); // 清除错误标志
cin.sync(); // 清除缓存中的数据
}
system("pause");
return 0;
}
当我输入第一个数为字母时,程序直接就结束了。可是我明明清除了缓存的数据啊,这使我很纳闷。查阅相关资料发现,cin.sync()使用与VC(2010...等等版本)可以正常运行。也就是可以清除缓存。但是在VS(2019,2020等等版本)中就用不了,我现在使用的VS版本为2019,下面是程序运行结果
我输入了一个字母,程序直接结束。如果是数字,就没有直接结束。如下图
既然知道cin.sync无法在VS2019中使用了,但不能就这样放着不管吧,还是有其他的解决方案的。
解决方案
第一种解决方案
废话少说,上代码
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void)
{
int a;
int b;
cout << "请输入一个整数a:" << endl;
cin >> a;
while (cin.fail()) {
cout << "输入错误,请重新输入" << endl;
cin.clear();
char temp;
while ((temp = getchar()) != '\n'); // 将输入缓存区的错误数据一个个抹去,直到换行符。
cin >> a;
}
cout << "请输入一个整数b:" << endl;
cin >> b;
while (cin.fail()) {
cout << "输入错误,请重新输入" << endl;
cin.clear();
char temp;
while ((temp = getchar()) != '\n'); // 将输入缓存区的错误数据一个个抹去,直到换行符。
cin >> b;
}
system("pause");
return 0;
}
运行结果,如下图
即使我如何输入字母,程序不会直接结束。当然代码中不加循环的话,就只会执行一次,就到下一个判断了。
第二种解决方案
上代码
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void)
{
int a;
int b;
cout << "请输入一个整数a:" << endl;
cin >> a;
while (cin.fail()) {
cout << "输入错误,请重新输入" << endl;
cin.clear();
cin.ignore();
cin >> a;
}
cout << "请输入一个整数b:" << endl;
cin >> b;
while (cin.fail()) {
cout << "输入错误,请重新输入" << endl;
cin.clear();
cin.ignore();
cin >> b;
}
system("pause");
return 0;
}
结尾
上面两种方案都是可行的,测试环境在VS2019,当然如果是用VC2010就没有这个顾虑,就可以直接使用cin.sync();但是这个函数在VS中用不了,其他的版本不知道。如果有一起学习C++的小伙伴,欢迎一起交流。