在学习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,一直进行死循环。
问题最终解决:
程序再次调试:
问题得以解决!