关于scanf的一些注意事项

文章详细阐述了使用scanf函数时应注意的几个关键点:一是变量必须以地址形式传递给scanf以改变其值;二是scanf的返回值表示匹配的输入项数;三是输入类型不匹配会导致数据错误或程序异常,因为scanf不会自动进行类型转换。错误的输入可能导致程序陷入死循环或产生不可预测的结果。
摘要由CSDN通过智能技术生成

第一点,设定的接受变量应以地址的方式出现在scanf内,这是因为scanf本身是一个函数,若不加地址相当于值传递,无法改变对应变量的值。

如:

 规定输入类型是整形(%d),故变量i前面要加&(取地址符)。

 规定输入类型是字符串(%s),而数组名本身为指针常量,指向数组第一个元素,故不用加&。

用如下方式,当然,如果不愿意用指针,也可以用如下方式,效果相同。

———————————————————————————————————————————

第二点 ,scanf返回值的类型是什么?

首先,先来了解一下typeid().name()函数,该函数的作用是返回一个类型名。

 i的类型是int,故输出int。

同理,我们可以得到scanf的返回类型。当然,其实答案也很简单,就是你规定的返回类型。

毕竟scanf是个函数。

 --------------------------------------------------------------------------------------------------------------------------------第三点,如果不按照规定的类型输入会怎么样?

由于scanf本身是个函数,但这个输入的数并不能发生自动类型转换,即

 输入b的时候并不会得到b的ascii码,而是一堆乱码。

而如果此时输入的是一串字符呢?

 此时可以看做是i只接受到了第一个字符,所以输出乱码。

而如果我们用函数去实现上述操作呢?

 

如图可见,发生了报错。

这个错误真的是相当的严重,它发生的实际原因是scanf无法将数据转为需要的类型,而已写的数据同样无法被清除,这样会陷入一种死循环。如果函数本身存在循环条件,会反复调用该函数而无法正常退出。

 如图,在第一次输入0调用test()函数,输入非法aaa,导致该函数反复运行,直到主函数循环条件结束。如果改为用break退出循环,则可能会一直执行。

 以上是最近编程发现的一些问题,由于本人能力不足可能存在很多语法和逻辑上的错误,欢迎指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值