c语言--scanf()函数与输入缓冲区的那些事

2016/7/16           

    C语言,我也学了两年了。因为大一上就开始接触了,所以可以算是两年了。可惜这两年来,不及这几天的所学。所以今天就在这里整理一下自己对C语言的认识,也算是把自己的认识跟别人交流下。这些知识大多是书上没有详细讲,却是基础的东西。

    言归正传,C语言的输入,目前明白了控制台输入,详讲这一部分,文件神马的后面补上。

    控制台输入函数—scanf,语法是scanf(“格式输出”,若干个参数的地址);

                                                                                                  

样例中控制台正在等待输入

当输入123,a的值就为123。这是输入整数的正常情况。如果不正常的情况又是怎么说的呢?

    这个时候,我键入了hello world!,明眼人都知道这是不可能读取成功的吧,因为一个是字符串,一个是整数,是吧!那我现在提一个问题,那我添加一条语句,scanf(“%d”,&a);

这样我第一次输入了hello world!,第二次输入123,a会不会等于123?

 

大家有没有注意到断点,(在图片的第9行的位置那里),我敲入了hello world之后不能再次敲入123整数,那我上面的问题连成为问题的条件都不能满足了咧。。。

       没事,大家可以猜想一下,会不会是因为那个空格的原因??我在hello world 两个单词之间添加了个空格符,scanf()函数会不会是因为这个所以判断是两次输入了呢,我们测试下,把空格去掉呗。。

 

              注意了一下,当我敲下回车来断定这句话我已经输入完毕了,结果却是这样的,程序直接跑到了断点处了。这跟我们的猜想不一样,我们上面猜想说,我第一个输入helloworld,第二次输入123,这样a就会等于123了,可是一个helloworld就把两条读取语句弄完了,这是怎么回事呢?

              我们刚才的猜想是基于一个前提的: 当我们键入错误的内容的时候,计算机会把错误的内容删除掉,这样才能实现我们的猜想,把123赋值给a。可是为什么计算机不会做这个事情呢?

              好吧,我们忘了自己是个码农了……这些事情是我们要做的,就是当客户输入错误的时候我们要这些东西清理掉。。。

              So,需要解释下读取过程机制了。

              首先,电脑有一个区域叫做输入缓冲区(由于是键盘输入,就主讲这个,其他情况还不是很能明白),当我摁1时,输入缓冲区就会有1,摁2就会有2。。。同理helloworld也是这样的。他们就像排队一样,按照顺序的被放置在输入缓冲区里。

              其次,我们使用的scanf()函数是从输入缓冲区里面读取的,读取顺序是按照进来的顺序。。比如说,我键入了123,然后再键入1234,根据上面的代码,第一条语句就会把123从输入缓冲区拿走,第二条语句就会把1234从输入缓冲区拿走。

           那么为什么我们的代码不能把helloworld拿走呢?我们都学过,整数用%d,字符用%c。。。我们是不是可以这么猜想,要想要拿整数的可以使用%d,想要拿非整数的是不是就得要%c或者%s呢?

 

这次我添加了输出语句,把a和b的值都输出出来,可以看到a是个不确定值,表示a没有读取到整数,而b成功读取了一个字符,但是后面还有elloworld,所以a还是没有整数可以读取。

 

换成字符串读取就把helloworld都拿走了,这时候输入缓冲区没有东西就会等待新的键盘键入,看到了a = 123,在这里可以这么说,各司其职,要从输入缓冲区拿东西你得要带合适的工具才行,不然它不会被带走,就一直在那里,尽管你后面怎么添加正确的输入也是没用的。。。

 

总结:

       我家有个一个仓库,它名字叫做输入缓冲区,它每天都会有很多货物进出,可是说来也很奇怪,它只能单向进入,单向出来。。。还好我家有很多个工人,我会委派工人去仓库拿东西。拿东西需要工具,我家工具挺多种的。可是总不能每次去拿东西都拿最大容器的工具去吧,这样有点浪费,所以,我想了一个办法。因为仓库进出货物的东西,是我出去购买回来的,我不是就知道了这些货物的大小和重量了吗?所以,我就设置了一系列的命令,比如%d,拿的是推车,%c什么都不带等等。这样子呢,我就可以只要根据货物发布命令就行了,好节省时间啊。--------------------------------------1

       可是呢,商家啊,就是这么的无良啊,会出问题,会把不该送来的东西给送来了。工人跟我报告说送来的不是床,我明明想要的是床。。。无语,得到了我的命令的工人肯定搬不动那些货物。。。那我得要亲自去看下是什么货物,然后再叫人去把那些东西搬走,然后再叫商家把正确的东西送过来,这么浪费我时间,日了。。。--------------------------------2

       不行啊,我得要有一个办法解决一下这样的问题,工人只会认识我命令要搬的东西,其他的,他不认识啊,这样就不会跟我报告是什么东西了,该怎么办呢??有了,我呢,还是按照正确送来的一样发布命令。如果成功搬运了,工人跟我报告搬了几件;如果不能搬运,跟我打个报告,我直接派出解决出错的工人(刚刚成立的一个部门),最后呢我在叫商家把东西送来,嘿嘿,之前的东西,我就不还回去了啦。。。------------------------------3

       握草,又是错的,这商家是要气死我了,那我就时时刻刻的盯着。。。。-------------4

 

汗!!发现了个错别字,那就不改了咧。。。

posted @ 2016-07-17 23:22  _梁小猪  阅读(495)  评论(0)    收藏  举报