scanf输入的一次小优化
scanf的功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
scanf在接收到规定格式之外的字符时会引发一系列错误(如我写扫雷的时候)
如图:
这是一个常见的错误,那我们是否有办法能够绕过这个错误,给用户再输入一次呢?
如果我们只用scanf就无法解决用户输入其他字符的问题,为此我写了一个函数去解决此类问题.
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int Judge(int n) { while (scanf("%d", &n) == 0 || getchar() != '\n') { printf("输入的字符不为整型,请重新输入:"); while (getchar() != '\n'); // 清除缓存区 } return n; } int main() { int t = 0; t = Judge(t); printf("%d", t); }
这里我运用了一个函数去实现.
输出结果:
这个结果就代表着我们成功限定了用户输入的数据类型
下面是我这个小萌新对scanf的理解和调整的想法
(借鉴了一下其他作者的内容,如有侵权请告知我!)
scanf的运作原理:
当要求的类型与输入的类型不符合时,scanf会选择直接跳过不接收该输入,不接收,也就是说缓存区中输入的东西既没被接收也没有被清除,就这么留在那里.但是用户下一次输入时,scanf缓存区有东西,系统就直接去读取了.
这虽然很不合理,但我们仍要想办法解决这个问题.
对 while (scanf("%lf", &n) == 0 || getchar() != '\n')的解释
若为 0 则说明第一个位置出现了字符
不为 0 则说明前面是整型,此时再取出一个字符
若为 \n 则说明缓存区清空,要是还有问题则又是非法字符
对 while (getchar() != '\n')的解释
清空缓存区,向缓存区读取数据,直到把所有数据读完,再跳出,防止无限循环
对 函数int Judge(int n)的解释
我们需要的是用户输入的为整型,故设置其返回值的类型为整型,Judge只是一个自定义的函数名,定义成其他的也可以
对 t = Judge(t)的解释
我们需要接收Judge的返回值,此时选择了用整型的变量t去接受返回值
接下来是对上面代码的扩展,如果我们可以限定用户输入为整型,是否也能调整为其他类型呢?
调整为浮点型
(头文件我就忽略了哈!!!)
double Judge(double n) { while (scanf("%lf", &n) == 0 || getchar() != '\n') { printf("输入的字符不为浮点型,请重新输入:"); while (getchar() != '\n'); // 清除缓存区 } return n; } int main() { double t = 0; t = Judge(t); printf("%.2f", t); }
输出结果如下:
当然调整成浮点型也是能接收整型的!!!(C语言自带的隐式转换功能)
就先到这里吧!!!