幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2633|回复: 4

[通用编程] 一道小題

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2008-1-30 16:31:55 | 显示全部楼层 |阅读模式
程序用於猜數組中的數,全對就退出
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. void main()
  5. {
  6.     int answer[4]={1,3,5,2},i,j,guess,times,a,b;
  7.     a=b=0;
  8.     j=0;
  9.     times=0;
  10.     printf("please enter four number:");
  11.    
  12.     while(a!=4)
  13.     {
  14.         scanf("%d",&guess);
  15.         if(guess<0)   ------------------->這判斷字母時重新輸入(因我機子上輸入字母是                       負)為什麼輸入了a就進入了死循環出不來呢?
  16.         {
  17.             printf("error!\n");
  18.             do
  19.             {
  20.                 scanf("%d",&guess);
  21.                
  22.             }while(guess<0);
  23.         }
  24.         for(i=0;i<4;i++)
  25.         {
  26.             if(answer[i]==guess && i==j)
  27.             {
  28.                 a++;
  29.             }
  30.             else if(answer[i]==guess && i!=j)
  31.                 b++;
  32.         }
  33.         j++;
  34.         
  35.         if(j==4 && a!=4)
  36.         {
  37.             times++;
  38.             printf("answer is error:%dA%dB!please guess again!\n\n\n\n",a,b);
  39.             j=0;
  40.             a=0;
  41.             b=0;
  42.             
  43.         }
  44.     }
  45.     printf("the answer is right! you used %d's times!\n",times);
  46. }
复制代码
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

4

主题

46

帖子

1559

积分

⑥精研

积分
1559
QQ
发表于 2008-1-30 17:00:35 | 显示全部楼层
这是因为你的输入流中是个字母但是你要输入的是数字,那么scanf()读到此处时,会设置出错状态errno并退出,同时你的那个字母仍然留在输入缓冲区中,下次循环到此处时,又把字母读入,设置出错,退出,如此就是死循环了……

其实你只需要判断if (scanf("%d", &guess) > 0,就可以说明输入正常了,因为在正常情况下scanf返回的是成功赋值的元素数目,否则返回EOF(-1).
整整两年之后的故地重游,幻森,I'm back~ 钻头直破天际,你,以为我们是谁!
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2008-1-31 00:07:19 | 显示全部楼层
还不是很懂..
如果像你说的那字母仍然在输入缓冲区中那么,if (scanf("%d", &guess) > 0
还是会在缓冲区中啊?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2008-1-31 12:21:41 | 显示全部楼层
情况基本上是这样的当你的sacnf()函数调用错误后,以后的SCANF函数均不会执行,比如
int guess;
scanf("%d",&guess);
scanf("%d",&guess);
printf("%d",guess);
这种情况下,如果你的第一次调用输入函数错误后,以后的输入函数都不会再继续执行。
在你的程序反应更加明显,由于你的循环中最后要以a!=4来进行判定,由于输入函数无法执行,将会直接执行其它语句,而在FOR循环中你的要求是i<4时进行累加,所以最后循环出来时a已经累加至5,所以最终限入没有输入提示的死循环
调试环境GCC4.2.2-TDM
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

2

主题

11

帖子

123

积分

③业余

积分
123
发表于 2008-2-10 16:20:37 | 显示全部楼层
a、b干什么用的?我为什么没看懂?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-29 06:40 , Processed in 0.023586 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表