标题:[求助]关于缓冲流输入时候出错问题
只看楼主
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
结帖率:73.33%
 问题点数:0 回复次数:34 
[求助]关于缓冲流输入时候出错问题


为什么是BUG!!!!!!!!!!!!
我这有个程序用TC2.O会发生错误(我想是编译器问题)
(我输入的是1回车2回车w回车)
#include <stdio.h>
main()
{
int a,b,c;

char d,e,f;

scanf("%d%d",&a,&c);
scanf("%c",&d);
scanf("%d",&b);
scanf("%c",&e);
scanf("%c",&f);
printf("%d,%d,%c,%d,%c,%c",a,c,d,b,e,f);
}

[此贴子已经被作者于2007-9-21 19:57:53编辑过]

搜索更多相关主题的帖子: BUG scanf 缓冲 
2007-09-21 19:38
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 

[转载]根据 ANSI C标准,和一些传统 C 的经验

1. C 语言的fflush 只是用作清除 output stream 之用。 对于使用 fflush 在 stdin 这个动作,是没有定义的行为

( ref: ISO/IEC 9899-1999 7.19.5.2 , ANSI Sec. 4.9.5.2 )


2. 这个问题并不是 Turbo C 2.0 的 bug,这是标准 scanf 的正常行为。

Scanf 并不清理使用者输入的 newline character (0xa) ,在连续的 scanf 中如果参数字符串的第一个字是 % 参数 (for example: scanf(“%d”); ),它将会顺利地把 <last newline char><string> 读取,并且把 newline char 视作 white space,把它忽略。因此,在这个帖的代码 (修改前) 是可以正常运作。这是传统的 scanf 运用方法。

修改后的代码, scanf("i=%d j=%d",&i,&j); ,问题出现在参数字符串的开头是 ‘i=’ ,使 scanf 遇到最后一次 newline character 的时候便进行辨认,结果提前结束,返回错误。 这段程序的 i 和 j 不变,所以情形像 scanf 把上一次的数据读取一样,做成这个错误。

标准 scanf 本身的设计存在很多毛病,所以普遍建议是,不要采用 scanf,或是在 scanf 后作出完善的检查和处理。


3. 在这个情况,由于 fflush 不应该使用在 stdin 上,所以我们使用其它方法来解决,例如在 scanf 后面,加上一行 getchar(); ,把没有清理的 newline char 消除

printf("Please input num:");
scanf("i=%d j=%d",&i,&j);
getchar(); // clear newline



You have lots more to work on! Never give up!c language!
2007-09-21 19:47
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 

我资质有限
能具体解释下
输入1回车2回车w回车后b不能正常输入和输出,只是输出随机值

[此贴子已经被作者于2007-9-21 20:07:49编辑过]


偶是菜鸟鸟偶惧WHO?!!!!
2007-09-21 19:57
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
得分:0 
到底发生什么错误你也不说一下,扔一句就跑了~~~~~

偶学编程,也许本身就是一个错。。。
2007-09-21 19:59
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 

我资质更差


You have lots more to work on! Never give up!c language!
2007-09-21 20:03
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
如图


偶是菜鸟鸟偶惧WHO?!!!!
2007-09-21 20:04
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
得分:0 
如果只是这个原因,编译没问题

那么原因,请参见2楼第1、2条
解决方法,请参见2楼第3条

偶学编程,也许本身就是一个错。。。
2007-09-21 20:07
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
能详细拿我这个题目说明下缓冲流中的情况吗?

偶是菜鸟鸟偶惧WHO?!!!!
2007-09-21 20:09
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 
b=0是因为你没定义,编译器给的
在你w后还有空格,显示不出而已,因为你也没有给e,f定义,编译器给了它空格
你用tc会这样

You have lots more to work on! Never give up!c language!
2007-09-21 20:14
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
b定义了啊
但是为什么回跳过b的输入呢?

偶是菜鸟鸟偶惧WHO?!!!!
2007-09-21 20:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-171908-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.185777 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved