当我们在键盘上输入多个数据时,数据之间必须用“空格键”、“Tab键(制表)”或“Enter键(回车)”隔开,作为多个数据之间的分隔标志。而“Enter键”又是我们结束输入的标志,即告诉计算机程序我们结束输入了,程序可以去干接下来自己该干的事了。
当我们输入多个数据时,情况如下:
#include <iostream>
using namespace std;
int main() {
int a;
char c;
float f;
cout << "请依次输入一个int型、char型和float型数据:";
cin >> a >> c >> f;
cout << "a:" << a << endl;
cout << "c:" << c << endl;
cout << "f:" << f << endl;
}
输入输出情况:
当我们输入的多个数据与我们定义的多个数据 的顺序和类型匹配时,程序能够正常读入数据,没有任何问题。
而当输入的多个数据类型不匹配时,会出现什么情况,请往下看:
结果很奇怪,我们可以看到,输入的数据“B”和“9.8”计算机完全没有读入。第一个数据本该输入int型,而我们输入的是float型,数据类型不匹配,C++就把float型“4.5”的整数部分“4”给读进a里面了,然后直接开始读取c的部分,此时程序的读取位置处在“4”之后、小数点“.”之前,结果就把小数点“.”给读进了c里面,以此类推,最终把x小数部分的“5”读进了f里面。然后就没有读入了,所以数据“B”和“9.8”就读不进去了,因为没有空间可以存放它们了。
这种情况主要是因为我们的输入数据类型与对应的接收该数据的标识符的类型不一致导致的,最好的解决方法当然是在输入时要避免数据类型不匹配的情况出现。但在编写具体程序时可能有时避免不了这种不匹配的情况,那我们就会想:让一个数据类型的不匹配只影响对应的那一个数据,而不影响其后面的其它数据(这应该是较为理想的情况)。此时我们就可以使用函数cin.clear()和cin.sync()来完成。
cin.clear():
更改cin的状态标识符。
cin.sync():
清除缓存区的数据流。
在读完一个数据后,将这两个函数一起使用,就可以把上一个数据的“剩余部分”(没有被读取,但还在缓冲区)清除掉,使程序的读取位置移动到以空格、制表或回车分隔开的下一个数据之前(即接下来读取就直接读取下一个数据)。更改代码如下:
#include <iostream>
using namespace std;
int main() {
int a;
char c;
float f;
cout << "请依次输入一个int型、char型和float型数据:";
cin >> a;
cin.clear();
cin.sync();
cin >> c;
cin.clear();
cin.sync();
cin >> f;
cout << "a:" << a << endl;
cout << "c:" << c << endl;
cout << "f:" << f << endl;
}