august 发表于 2008-1-30 16:31:55

一道小題

程序用於猜數組中的數,全對就退出

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
    int answer={1,3,5,2},i,j,guess,times,a,b;
    a=b=0;

    j=0;
    times=0;
    printf("please enter four number:");
   
    while(a!=4)
    {
      scanf("%d",&guess);
      if(guess<0)   ------------------->這判斷字母時重新輸入(因我機子上輸入字母是                       負)為什麼輸入了a就進入了死循環出不來呢?
      {
            printf("error!\n");
            do
            {
                scanf("%d",&guess);
               
            }while(guess<0);
      }
      for(i=0;i<4;i++)
      {
            if(answer==guess && i==j)
            {
                a++;
            }
            else if(answer==guess && i!=j)
                b++;
      }
      j++;
      
      if(j==4 && a!=4)
      {
            times++;
            printf("answer is error:%dA%dB!please guess again!\n\n\n\n",a,b);
            j=0;
            a=0;
            b=0;
            
      }
    }
    printf("the answer is right! you used %d's times!\n",times);
}

呆呆蜗牛 发表于 2008-1-30 17:00:35

这是因为你的输入流中是个字母但是你要输入的是数字,那么scanf()读到此处时,会设置出错状态errno并退出,同时你的那个字母仍然留在输入缓冲区中,下次循环到此处时,又把字母读入,设置出错,退出,如此就是死循环了……

其实你只需要判断if (scanf("%d", &guess) > 0,就可以说明输入正常了,因为在正常情况下scanf返回的是成功赋值的元素数目,否则返回EOF(-1).

august 发表于 2008-1-31 00:07:19

还不是很懂..
如果像你说的那字母仍然在输入缓冲区中那么,if (scanf("%d", &guess) > 0
还是会在缓冲区中啊?

Zelsazgh 发表于 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

子陵~ 发表于 2008-2-10 16:20:37

a、b干什么用的?我为什么没看懂?
页: [1]
查看完整版本: 一道小題