算是在编程中遇到的小插曲:
由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.youkuaiyun.com/qq_22115231/article/details/79728878 //ascii控制字符
https://blog.youkuaiyun.com/playboy_lei/article/details/50549838
https://www.cnblogs.com/hubavyn/p/3996413.html
https://www.cnblogs.com/tonglingliangyong/p/3908463.html