目录
这是一个常见的错误,那我们是否有办法能够绕过这个错误,给用户再输入一次呢?
对 while (scanf("%lf", &n) == 0 || getchar() != '\n')的解释
对 while (getchar() != '\n')的解释
接下来是对上面代码的扩展,如果我们可以限定用户输入为整型,是否也能调整为其他类型呢?
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语言自带的隐式转换功能)
今天就先到这了!!!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。