c++中cin输入与clt+z结束输入相关的问题

算是在编程中遇到的小插曲:

由while(cin >> a[t++]);作输入时,用clt+z结束输入时,会在数组末尾多录入一个0,于是在电脑上测试了下(环境window+dev)

        char c = 'b';
	int a, b;
	
	cin >> b;//模拟while输入(先是几个正常输入),这里只输入并显示一个值。
	cout << b << endl;
	cout << a << endl;//先输出a的值,由于没有初始化一般都是垃圾值
	cin >> a;
	if(cin.fail())//检测当前的io条件状态fail标识符的值
		cout << "wrong1" << endl;//输出wrong1表示输入有误
 	cout << a << endl;
	cin.clear();
	cin >>  c;
	cout << c << endl;
	printf("%x", c);//输出c的16进制
	if(cin.fail())
	cout << "wrong2" << endl;

运行结果:

3clt+z<enter> 然后,显示b->3, a-> 垃圾值,由于键入的是clt+z cin读取时类型不符,输入有误,置fai标识符为1,但还是赋给a值为0,后面经过clear()清零标识符后输入打开,同时由于前面未能读取的clt+z还在缓冲区,则直接赋给c,通过16进制显示c值为1a,对应ascii码26控制字符——替换(substitute)

实际上就是,while(cin >> a[t++]);用clt+z作为输入结束时,最后cin还会将clt+z作为字符读入数组,只是由于输入的类型与数组不匹配,最后还是以0值多输入一个到数组。所以这样使用时需注意。

知识扩充:

clt+z输入后会使io的条件状态(condition state)改变,条件状态中有四个标识:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回

 

EOF (win -- ctrl+z,unix -- ctrl + d)  

而只有当 EOF 出现在一行输入的首部时  输入流才会正确的设置 eofbit

当EOF 出现在 一行输入的中间或者末尾 输入流会自动忽视掉 EOF 以及 跟在它后面的参数

 

输入clt+z<enter>  后 eof(文件结束)的值会被置1,io输入会失效,无法继续输入,若之前的输入无误,后面还要继续输入则需在输入之前加上cin.clear(),来清零标识符;若先前的输入有误(如需输入的变量是int型的你输入了char类型的值),则标识符failbit会被置1,此时虽然cin.clear()将标识符清零但char类型的输入还留在数据流中,此时还应加上cin.sync()方法来清空缓冲区的数据流。对于清除缓冲区,还可以用到ignore

参考文章:
https://blog.csdn.net/qq_22115231/article/details/79728878   //ascii控制字符
https://blog.csdn.net/playboy_lei/article/details/50549838
https://www.cnblogs.com/hubavyn/p/3996413.html
https://www.cnblogs.com/tonglingliangyong/p/3908463.html

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页