第一点,设定的接受变量应以地址的方式出现在scanf内,这是因为scanf本身是一个函数,若不加地址相当于值传递,无法改变对应变量的值。
如:
规定输入类型是整形(%d),故变量i前面要加&(取地址符)。
而
规定输入类型是字符串(%s),而数组名本身为指针常量,指向数组第一个元素,故不用加&。
用如下方式,当然,如果不愿意用指针,也可以用如下方式,效果相同。
———————————————————————————————————————————
第二点 ,scanf返回值的类型是什么?
首先,先来了解一下typeid().name()函数,该函数的作用是返回一个类型名。
如
i的类型是int,故输出int。
同理,我们可以得到scanf的返回类型。当然,其实答案也很简单,就是你规定的返回类型。
毕竟scanf是个函数。
--------------------------------------------------------------------------------------------------------------------------------第三点,如果不按照规定的类型输入会怎么样?
由于scanf本身是个函数,但这个输入的数并不能发生自动类型转换,即
输入b的时候并不会得到b的ascii码,而是一堆乱码。
而如果此时输入的是一串字符呢?
此时可以看做是i只接受到了第一个字符,所以输出乱码。
而如果我们用函数去实现上述操作呢?
如图可见,发生了报错。
这个错误真的是相当的严重,它发生的实际原因是scanf无法将数据转为需要的类型,而已写的数据同样无法被清除,这样会陷入一种死循环。如果函数本身存在循环条件,会反复调用该函数而无法正常退出。
如图,在第一次输入0调用test()函数,输入非法aaa,导致该函数反复运行,直到主函数循环条件结束。如果改为用break退出循环,则可能会一直执行。
以上是最近编程发现的一些问题,由于本人能力不足可能存在很多语法和逻辑上的错误,欢迎指正。