C语言scanf的工作原理详解_第1页
C语言scanf的工作原理详解_第2页
C语言scanf的工作原理详解_第3页
C语言scanf的工作原理详解_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言scanf的工作原理详解目录原理解释解决办法总结

原理解释

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

#includeiostream

usingnamespacestd;

intmain(){

inta;

charc;

scanf("%d",

printf("a=%d",a);

scanf("%c",

printf("c=%c",c);

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

下面先介绍缓冲区原理。

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

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

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

#includeiostream

usingnamespacestd;

intmain(){

inta;

intc;

scanf("%d",

printf("a=%d",a);

scanf("%d",

printf("c=%d",c);

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

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

#includeiostream

usingnamespacestd;

#defineEOF(-1)

intmain(){

inti;

while(scanf("%d",i)!=EOF){

printf("i=%d\n",i);

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

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

解决办法

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

#includeiostream

usingnamespacestd;

#defineEOF(-1)

intmain(){

inti;

while(rewind(stdin),scanf("%d",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论