C语言scanf的工作原理是什么(c语言,scanf,开发技术)

时间:2024-04-25 15:36:06 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

原理解释

先来观察一段代码和运行结果:

#include<iostream>usingnamespacestd;intmain(){inta;charc;scanf("%d",&a);printf("a=%d",a);scanf("%c",&c);printf("c=%c",c);}

C语言scanf的工作原理是什么

该代码明明有两个 scanf ,但在运行过程中,执行完第一个 scanf 和 printf 后,代码直接停止了,并没有继续执行下一个 scanf ,这是为什么呢?

下面先介绍缓冲区原理。

行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的IO操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作.典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout)。

如上面例子所示,我们向标准输人缓冲区中放入的字符为 &lsquo;20\n&rsquo;,输入&rsquo;\n&rsquo;(回车)后, scanf 函数才开始匹配, scanf 函数中的%d 匹配整型数 20 ,然后放入变量 i 中,接着进行打印输出,这时 &lsquo;\n&rsquo; 仍然在标准输入缓冲区(stdin)内,如果第二个 scanf 函数为 scanf("%d",&i) ,那么依然会发生阻塞,因为 scanf 函数在读取整型数、浮点数、字符串(后面介绍数组时讲解字符串)时,会忽略 '\n&rsquo; (回车符)、空格符等字符(忽略是指scanf 函数执行时会首先删除这些字符,然后再阻塞), scanf 函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行 scanf("%c",&c) 语句时,不会忽略任何字符,所以 scanf("%c",&c) 读取了还在缓冲区中残留的 &lsquo;\n&rsquo; 。

上面说的很专(啰)业(嗦),实际上就是:scanf 接收的是 %c,它把还存在缓冲区的 &lsquo;\n&rsquo; 当成了一个字符,导致了代码结束,如果 scanf 接收的是其他类型的数据,则会忽略这个 &lsquo;\n&rsquo;,继续运行下面的代码,再举一个例子:

#include<iostream>usingnamespacestd;intmain(){inta;intc;scanf("%d",&a);printf("a=%d",a);scanf("%d",&c);printf("c=%d",c);}

C语言scanf的工作原理是什么

例如以上代码,我输入了好多个空格,但根本不影响实际的运行结果,因为它们都被 printf 在缓冲区内删除掉了,scanf 是不会删除缓冲区的内容的。

再来看一段代码理解一下:

#include<iostream>usingnamespacestd;#defineEOF(-1)intmain(){inti;while(scanf("%d",&i)!=EOF){printf("i=%d\n",i);}}

C语言scanf的工作原理是什么

以上的 scanf 输入,是 10,20,a 的顺序输入,在输入 a 之后,代码一直打印上一个 printf 的内容,这是因为: scanf 返回的是成功读入的数据项数,在我的输入中输入了一个 a ,a 是无法匹配 %d 的,scanf 也不会删除 a ,所以 scanf 的返回值是 0(没有成功匹配),不等于 -1 ,此时就会一直 while 循环。

并且,在 scanf 返回值为 0 的情况下,没有读取 i 的值,此时 i 的值还是上一次输入的 20,这就会导致 while 循环一直打印上一次的 i=20。

C语言scanf的工作原理是什么

解决办法

使用 rewind(stdin) 清空缓冲区:

#include<iostream>usingnamespacestd;#defineEOF(-1)intmain(){inti;while(rewind(stdin),scanf("%d",&i)!=EOF){printf("i=%d\n",i);}}

C语言scanf的工作原理是什么

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C语言scanf的工作原理是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Java字符串中指定部分反转的方式有哪些下一篇:

13 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18