Poedu_C语言_lesson16_20160916_scanf详解


1.scanf:接收用户的输入

    在接收一个数组的时候,scanf会对数组进行重置的操作,为什么说重置而不是清零呢?看编译器中的内存即可:

   

  以上是执行了第一步清零操作,可看到,tmp数组所占据的20个字节都被置0了


接着,对字符串进行了一个赋值操作,注意:对字符串的赋值一般使用strcpy,当然这不是唯一的方式...

内存显示,赋值成功

随后,我从键盘输入一个abc,此后,可能会有两种情况:

1.输出abc,也就是原来的值被洗掉了

2.输出abcdefg,说明后面的值还在,接收的时候只是将前面一部分的内存覆盖掉

来看结果:

在abc之后,多加了一个00,这个00也就是我们所说的\0,也就是一个字符串的结尾,所以,当下次进行输出的时候,输出的应该是abc。而之前所说的重置而非清零,是因为从内存中看,其它的值并没有变成0,所以不是清零。而原来在6C位置还有字符的,现在也变成了统一的fe。

看一下总的结果:


2.printf在输出的时候有可能会有隐式的转换(比如一个Int型数据,有时可以以字符的形式进行输出),但是scanf完全不会有这样的隐式转化

=>即:必须使用对应的占位符接收数据的输入

==>例:用%c来接收int型

==>scanf会略过int型数据而去寻找合适的数据,它不会认为你输入的数据是可转换的(这点同样通用于浮点数)

==>即:scanf里面的字符必须与输入数据类型对应

==>scanf与scanf_s之间的区别

=>scanf_s只允许你写入和读取我规定大小的这么一块区域,而不会允许别人写入和运行一些其它东西。而scanf可以允许别人在后面无限大的空间里写无限的东西

=>scanf不安全:

=>假设我们只是想让用户输入一个int型数据,但是他却并没有这么做,而是在后面多输入了一些恶意代码,使其填充在后面的缓冲区中,scanf依然会进行读取,然后想办法使EIP指向恶意代码,使程序执行这段代码,程序就变得不安全了,这就是缓冲区溢出,是一个bug


3.scanf接收输入的过程:

=>如果输入的值不符合要求,它会放弃这个值

=>同时输入两个数,如果第一个数不正确,scanf会直接跳到下一条语句,不会再去考虑你的第二个格式是否正确

=>严格的格式控制,只有完全一样的类型、完全一样的格式的时候才能输入到指定的变量中

=>输入时,输入的字符先保存在输入缓冲区中,scanf从输入缓冲区中读取值,如果读取成功,这个值会从缓冲区中消失

=>接收字符串:

=>是以空格结束的!读取到空格时,读取就会停止

=>如果程序中使用了scanf,再用getchar()可能达不到阻塞的作用,是因为如果输入缓冲区还有值,就不会发生阻塞


4.在VS的Debug下,未经过初始化的局部变量都是0xccccccc,整数一般初始化为0;double型赋值为0.0


5.对于scanf,在往后的调试中,如果出现了这些错误,要能够知道是哪里出了问题


6.实验案例(可进行实验,便于理解)






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值