您的位置:首页 > 编程语言 > C语言/C++

Poedu_C语言_lesson16_20160916_scanf详解

2016-09-26 10:25 253 查看


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.实验案例(可进行实验,便于理解)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: