Chinaunix首页 | 论坛 | 博客

Lzy

  • 博客访问: 215119
  • 博文数量: 56
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-27 15:50
文章分类

全部博文(56)

文章存档

2014年(56)

我的朋友

分类: C/C++

2014-09-17 19:58:14

stdin流阻塞的分析
以scanf函数为例,运行下述程序
1
2
3
4
5
6
7
8
9
10
11
12
13
#include
intmain()
{
inta=0;
intb=0;
intc=0;
intret=0;
ret=scanf("%d%d%d",&a,&b,&c);
printf("第一次读入数量:%d\n",ret);
ret=scanf("%d%d%d",&a,&b,&c);
printf("第二次读入数量:%d\n",ret);
return0;
}
我们定义了a,b,c三个变量来接受输入的内容,定义了变量ret来接收scanf函数的返回值。
正确输入的话:
但是当输入内容与格式换字符串不匹配时,结果会令人大跌眼镜(仔细分析会对stdin流有更深入理解的哦):
执 行到第一个scanf时,当输入字符’b’的时候与ret=scanf("%d%d%d",&a,&b,&c);中的格式化字符 串不匹配,stdin流被阻塞,scanf函数不在读取后面的部分,直接将1返回,表示只将stdin流中的1读入到了变量a中。
执行到第二个scanf时,字符’b’还是与格式化字符串不匹配,stdin流仍然被阻塞,所以没有提示输入,scanf函数将0返回。
将代码作如下修改,可以有力的证明上述结论。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include
intmain()
{
inta=0;
intb=0;
intc=0;
intret=0;
ret=scanf("%d%d%d",&a,&b,&c);
printf("第一次读入数量:%d\n",ret);
ret=scanf("%c%d%d",&a,&b,&c);
printf("第二次读入数量:%d\n",ret);
return0;
}
当把第二个scanf函数内的格式化字符串改为”%c%d%d”时,运行结果如下:
执行到第一个scanf函数时,由于输入’b’的原因scanf函数直接返回1,stdin流阻塞。
执行到第二个scanf函数时,字符’b’与格式化字符串”%c%d%d”中的%c匹配,stdin流终于疏通,在输入6,则将变量a,b,c分别赋值为98(‘b’的ASCII码)、2、6,scanf函数返回3。
在scanf函数使用fflush(stdin);,清空输入缓冲区:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include
intmain()
{
int a=0;
int b=0;
int c=0;
int ret=0;
ret=scanf("%d%d%d",&a,&b,&c);
fflush(stdin);
printf("第一次读入数量:%d\n",ret);
ret=scanf("%d%d%d",&a,&b,&c);
fflush(stdin);
printf("第二次读入数量:%d\n",ret);
return0;
}
运行结果
stdin流在实际中经常由于一些不正确的使用发生阻塞,注意使用fflush(stdin);,可以解决很多问题哦!
阅读(1783) | 评论(0) | 转发(0) |
0

上一篇:gdb入门篇

下一篇:硬链接与软链接

给主人留下些什么吧!~~