“输入的数据类型一定要与变量/格式符的数据类型相同,否则会出现错误!”但是,如果不按这句话做,会有什么后果?为了检测输入类型错误对程序的影响,我写了如下代码:
#include<cstdio>
int main(){
int a;
for(;;)scanf("%d",&a);
}
当程序运行起来时,我先后输入了若干串数码,比如 1,甚至于 1 后面跟着 200 个 0,程序依然可以输入。可就在这时,当我输入了一个字符 a 后,整个程序便陷入了死循环,输入工作的进行戛然而止;而如果把 for(;;)scanf("%d",&a) 换成对变量 a 的两次输入,且在第一次输入时输入字符 a,程序便也跳过了第二次输入,完成了它的使命。
把 scanf 换成 cin,程序也会出错吧!我更换了指令,果然不出所料,和 scanf 遇到错误数据类型产生的错误近乎相同(好在 cin 懂得判断整数溢出,当输入数码溢出 int 时,程序也停了)。而把 scanf 中的 %d 换成 %c,程序在输入字符串后,也能正常工作。
看到程序的错误后,我开始思考了如下问题:
- 这各种各样输入数据类型错误导致的错误,是未定义行为(UB)遭致的吗?
- 为什么
scanf 在整数溢出时不会出现上述错误,而 cin 就会呢?
- 将
%d 换成 %c 后,程序为什么不但不出错,反而还能输入字符给 int 型变量 a 呢?
- 我查了百度,发现
cin 对象的 fail(),good(),clear() 函数可以帮助我们排查一些输入类型错误。那怎样进行 scanf 的错误排查呢?
- 有什么输入指令能在输入时就能对异常数据类型进行判断、处理和解决,而不需人为操作?
大家知道这些问题的答案吗?