【C语言基础补充2】scanf函数的详细使用及其原理

在学习C语言中,printf、scanf等都是我们非常熟悉的函数,那么scanf是怎么操作的呢?可能还是挺多朋友不清楚,这里主要是补充有关scanf更加深层的知识给大家。

问题引入:

在使用scanf函数的时候,如何判断用户输入的数据符合需求?
例如下面程序:
在这里插入图片描述那么我们运行一下程序:
在这里插入图片描述
可以看到如果中规中矩输入100,输出是正常的。
但是在我们开发项目的时候,可能有用户不会按照套路去输入,那么会导致输出异常。
那么我们怎么去杜绝这个情况呢?

有朋友可能会说,在scanf与printf函数之间使用If语句判断是否为整型,那么我想问问大家,怎么去判断一个数为整型呢?

问题剖析:

scanf函数究竟是怎么操作的呢?
在这里插入图片描述
当我们输入数据的时候,是内核中的驱动程序与键盘相连,然后驱动收到键盘输入的数据后,将数据传递给标准化IO缓冲中,然后scanf其实就将缓冲区的数据,搬运到我们申请的内存块a中。
那么,scanf函数搬运成功的话,就会返回1,失败则返回0。
但是,为什么我们输入aa的时候,

问题初步解决:

从上面剖析可以简单地对程序进行改写以解决问题:
在这里插入图片描述

程序调试:

当我们输入100依然正常输出,但是如果输入aa:
在这里插入图片描述

新问题引入:

之所以会出现以上的情况,那么就代表了程序一直死循环在输出语句之中,这是什么原因呢?我们可以回到刚刚scanf函数的剖析图中:
在这里插入图片描述
当我们输入aa的时候,数据来到了缓冲区,aa不符合scanf的搬运条件,因此scanf并不会将它搬运到内存a中,就会返回0。
但是aa数据始终在缓冲区,无论下一次程序进行的是什么都会返回0,一直进行死循环。

问题最终解决:

在这里插入图片描述

程序再次调试:

在这里插入图片描述
问题得以解决!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值