C++连续输入多个数据时可能出现的问题及解决方法

当我们在键盘上输入多个数据时,数据之间必须用“空格键”、“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;
}

注:函数cin.clear()和cin.sync()在某些编译器下不会报错,也不会发挥相应功能,即没有作用。只有在特定的编译器才有作用。亲自测试了下:在visual studio平台不能发挥作用!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金泽遗梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值