先看此程序第一次测试的运行结果:
这是此程序第二次测试运行结果:
由此说明了什么呢?在第一次测试时,我们输入的是1.2,但scanf函数只读了整数,后面的圆点被视为非数字字符导致输入结束。由于这个非数字字符仍然保存在输入缓冲区中,因此第二个scanf函数调用语句从输入缓冲区中读到的数据仍然是这个非数字字符,所以没等用户输入数据,就打印出了变量b中的随机值,和没有执行第9行语句的效果是一样的。在第二次测试时,由于用户输入的是非数字字符‘q’,而且它一直保存在输入缓冲区中,因此两个scanf函数都不能够正确读取数据,相当于变量a,b都没有被赋值,所以打印出来的结果是不确定的,为随机值。
那我们该如何解决这个问题呢?我们可以考虑用检验函数scanf调用返回值的方法,如图
这样能避免一些问题,但当后面输入小数时后面小数点的值还是会视作无效的。因为函数scanf不做参数类型匹配检查。
学习笔记:第十五行的作用是为了确保留在缓冲区的非数字字符不会影响其后的数据输入,所以调用fflush()来清除输入缓冲区中的内容。