令人头疼的scanf的输入和读取!!本文涉及到缓冲区,Tab,空格的运用知识点。

前言:

1,了解scanf,getchar,putchar

2,scanf输入时候的奇怪现象

3,解释说明

1.了解scanf,getchar,putchar

下面是关于他们的输入和输出的简单示例

 2.scanf输入时的奇怪现象

例子1

b怎么就是10了呢??明明没有专门给b赋值呀,为啥会有值呢??

因为我们敲了5和回车进去,回车是字符,getchar取的就是字符,所以回车被getchar取走了。

而getchar的ASCII值是10,所以打印b是10。

补充:换行符"\n"的值是10,回车的值是13,但是我们口头说的回车其实是换行的意思。

下面这幅图是加深例子1的解释,再运用一次刚刚解释的知识,方便大家更好的理解。

 当我们输入5和回车,第二个scanf并没有等待,而是直接跳过,来到getchar这里等待。

因为5被第一个scanf取走,缓冲区还剩一个回车,第二个scanf是“%c”取字符型,所以直接取走,直接到getchar()等待。

例子2

 按照这个窗口的显示,c不应该是0.333333么,为什么是0,5呢??而且不是应该输入两个数吗?为什么会输入三个数呢??别急别急,下面我将细细的解释其中的缘由


铺垫:scanf是读了一个数字,读到了\n 表示知道该结束了,就结束函数了。


上面这个格式是%d\n 等于是一个数字加一个\n,那么咱们输入一个数字1,按回车,这个时候输入缓冲区里是 1  \n。第一个scanf先读取了1 ,然后放进a里,然后scanf里的\n 对应了缓冲区里的\n(抵消掉了),这个时候是不是没有多余的\n来告诉第一个scanf 什么时候结束。


第一个scanf就会阻塞 等待结束。


这个时候你再输入2和回车。


缓冲区里现在变成了 2和 \n 


这个时候还是第一个scanf看到了2,但是第一个scanf的格式只是接受一个整数,这个2对他来说是多余的没用,所以跳过,再看到2后面的\n 就会结束了 。


但是注意,第一个scanf遇到2后面的\n结束并不会吸收这个\n   还是把它放在缓冲区不动


然后你进入下一个 scanf,你输入了 3和 回车


这个时候缓冲区变成了 2  /n  3 /n(第一个scanf只是跳过2,所以2是还在缓冲区的)


第二个scanf读取了2放进b里,%d\n的格式吸收一个\n,所以后面还有3 \n ,跳过3  遇到\n 结束


所以a是1 b是2


这个时候缓冲区还有3 \n


这个时候,如果你用getchar() 打印两次(getchar会自动接收缓冲区的东西)


可以看到一个是51,一个是10  刚好对应(第一张截图提到过字符3是51,/n是10)
 

小提示:通俗的理解,咱们scanf一般是不要在输入格式里加\n的,容易出错,以后也要注意这个问题,而且咱们平时正常输入的时候就是输入一个数字,然后回车 就能输入进去

保姆级教学,觉得写的好的不妨给个关注,之后也会一直更新,现在内容还不多,但我相信,各位的支持是我走下去的动力。感兴趣的不妨一键三连,点个关注!!嘿嘿

文章有问题的地方可以加我v(谢谢大家让我急时修改),有疑惑的也加我v(免费相互探讨学习)

v+Jj13737306769

猜你喜欢

转载自blog.csdn.net/cnjdd/article/details/129987918