免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiangfei108
打印 上一主题 下一主题

无意中发现的一个错误,请高手指点!!! [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-03 13:51 |只看该作者
就比如那个 %d 用的也不对

论坛徽章:
0
22 [报告]
发表于 2007-05-03 15:15 |只看该作者
原帖由 antigloss 于 2007-5-3 13:51 发表
就比如那个 %d 用的也不对



%d怎么不对呢,难道还有其他的写法?

论坛徽章:
0
23 [报告]
发表于 2007-05-03 15:20 |只看该作者
谢谢antigloss和 MMMIX,还有前面几位DX。以后还请多多指教!!

论坛徽章:
0
24 [报告]
发表于 2007-05-03 16:40 |只看该作者
原帖由 xiangfei108 于 2007-5-3 11:26 发表



不好意思,我还是不明白。scanf一次调用不成功之后,就不能再次调用了吗?

我现在的问题是,输入a以后,程序一直不停的输出。说明程序一直循环,但是不会再次执行scanf。


scanf语句执行时,首先从缓冲区中读入一个数据,如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,如果其中有一个参数不匹配,那么就从这个地方跳出来,忽略当前这个scanf,而继续执行下一条语句.
我这儿有一个例子,也许能帮助你更了解.

  1. int main()
  2. {
  3.         int a = 1, b = 2;
  4.         char c = 'K';
  5.         int i1, i2;
  6.         i1 = scanf("%d%d\n", &a, &b);
  7. //        fflush(stdin);
  8.         i2 = scanf("%c", &c);
  9.         printf("%d\n%d\n%c\n", a, b, c);
  10.         printf("i1 = %d\ni2 = %d\n", i1, i2);
  11.         return 0;
  12. }
复制代码


如果你输入12 a 然后回车.程序输出12 2 a 1 1后退出.因为第一个scanf由于读第二个参数的时候发现与要求的不相同,所以就会跳出, 那么返回1,即i1的值为1, 继续执行下一个scanf(),而刚刚的缓冲区中还存在a,所以说就不用从键盘再去读数据,而直接将刚刚的a的值赋给c,所以就直接打印出来.12 2 a. 而此时i2的值为2.
而如果你加上了一个fflush之后,就可以将刚刚的缓冲区里面的内容给清除掉.因此你这时候输入12 a之后还要再输入一个字符才可以使程序退出.因为将缓冲区清空之后那么第二个scanf就会一直在那儿等待你输入.

这也就是为什么你虽然没有输入但程序一直在运行的原因了. 因为缓冲区里面的数据仍然存在. 但是却读不进来! 所以一直在循环scanf()这个函数.

论坛徽章:
0
25 [报告]
发表于 2007-05-03 16:50 |只看该作者
原帖由 scutan 于 2007-5-3 16:40 发表
        i1 = scanf("%d%d\n", &a, &b);
            //        fflush(stdin);


fflush(stdin) is undefined. you should try your best to avoid it.

From ISO C99
int fflush(FILE *stream);

If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host environment
to be written to the file; otherwise, the behavior is undefined.

[ 本帖最后由 antigloss 于 2007-5-3 16:52 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
26 [报告]
发表于 2007-05-03 17:13 |只看该作者
原帖由 scutan 于 2007-5-3 16:40 发表
scanf语句执行时,首先从缓冲区中读入一个数据,如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,如果其中有一个参数不匹配,那么就从这个地方跳出来,忽略当前这个scanf,而继续执行下一条语 ...

看看 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结。这个帖子我大致浏览了一下,相当不错,建议看看。

论坛徽章:
0
27 [报告]
发表于 2007-05-03 17:23 |只看该作者
原帖由 MMMIX 于 2007-5-3 17:13 发表

看看 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结。这个帖子我大致浏览了一下,相 ...

谢谢. 我去看看.
另外,我刚刚的分析应该没有错吧.
谢谢!

论坛徽章:
0
28 [报告]
发表于 2007-05-03 17:33 |只看该作者
#include <stdio.h>
main()
{unsigned int a;
scanf("%d",&a);
while(1)
  {
   while(a<100)
     {printf("%d\n",a);
      scanf("%d",&a);
      }
    printf("error!!");
    scanf("%d",&a);
  }
}
这错误跟下面的没有本质区别

while(1)
    ;

你进入一个循环想出来,就要考虑它是否在某种情况不能出来。

论坛徽章:
0
29 [报告]
发表于 2007-05-03 18:25 |只看该作者
原帖由 antigloss 于 2007-5-3 16:50 发表


fflush(stdin) is undefined. you should try your best to avoid it.


嗯. 对. fflush()只对输出流有效,对输入流是无效的.
那就有个问题了,既然对输入流是无效的,为什么这儿加上这一行代码之后就可以了呢?

论坛徽章:
0
30 [报告]
发表于 2007-05-03 18:27 |只看该作者
原帖由 scutan 于 2007-5-3 18:25 发表

嗯. 对. fflush()只对输出流有效,对输入流是无效的.
那就有个问题了,既然对输入流是无效的,为什么这儿加上这一行代码之后就可以了呢?

不是无效,而是 undefined。也就是 implementation-dependant
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP