关于 C++ 中,输入数据类型与变量/格式符类型不同时,产生的错误的 5 个疑问
  • 板块学术版
  • 楼主Herman526
  • 当前回复47
  • 已保存回复47
  • 发布时间2023/1/17 12:12
  • 上次更新2023/10/24 03:52:41
查看原帖
关于 C++ 中,输入数据类型与变量/格式符类型不同时,产生的错误的 5 个疑问
786834
Herman526楼主2023/1/17 12:12

“输入的数据类型一定要与变量/格式符的数据类型相同,否则会出现错误!”但是,如果不按这句话做,会有什么后果?为了检测输入类型错误对程序的影响,我写了如下代码:

#include<cstdio>
int main(){
	int a;
	for(;;)scanf("%d",&a);
}

当程序运行起来时,我先后输入了若干串数码,比如 11甚至于 11 后面跟着 20020000,程序依然可以输入。可就在这时,当我输入了一个字符 a 后,整个程序便陷入了死循环,输入工作的进行戛然而止;而如果把 for(;;)scanf("%d",&a) 换成对变量 aa 的两次输入,且在第一次输入时输入字符 a,程序便也跳过了第二次输入,完成了它的使命。

scanf 换成 cin,程序也会出错吧!我更换了指令,果然不出所料,和 scanf 遇到错误数据类型产生的错误近乎相同(好在 cin 懂得判断整数溢出,当输入数码溢出 int 时,程序也停了)。而把 scanf 中的 %d 换成 %c,程序在输入字符串后,也能正常工作

看到程序的错误后,我开始思考了如下问题:

  1. 这各种各样输入数据类型错误导致的错误,是未定义行为(UB)遭致的吗?
  2. 为什么 scanf 在整数溢出时不会出现上述错误,而 cin 就会呢?
  3. %d 换成 %c 后,程序为什么不但不出错,反而还能输入字符给 int 型变量 aa 呢?
  4. 我查了百度,发现 cin 对象的 fail(),good(),clear() 函数可以帮助我们排查一些输入类型错误。那怎样进行 scanf 的错误排查呢?
  5. 有什么输入指令能在输入时就能对异常数据类型进行判断、处理和解决,而不需人为操作?

大家知道这些问题的答案吗?

2023/1/17 12:12
加载中...