Ubuntu 10.04下手动安装Eclipse CDT手把手教程

问题很简单。。。
就是在下面的这个小程序里,如何实现在用非数值的字符输入时,能提示错误,并且重新开始循环
而不是死循环。。。。。
先谢谢大家





代码:
/*
   2011年4月16日23:51:31
   名称:猜数字小游戏
   功能:随机四个十以内的数字,在位置提示(B)和位置以及值提示(A)下猜出它们正确的值以及位置
   目标:训练 for 和do while 的循环流程

*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>//使用当前时钟做种子
int main( void )
{   
   int i, a[5], b[4], c[5], h, A, B, H = 0;
   srand( (unsigned)time( NULL ) );//初始化随机数   
   for( i = 1; i < 5; i= i+1)
   {
      do
      {
         a[i] = rand()%9; //随机数值
         c[i] = a[i]; // 注意交换数值,以免自己与自己比较,从而陷入死循环
         a[i] = -1; // 将自身的数据暂时放弃
      }
      while (c[i] == a[1] || c[i] == a[2] || c[i] == a[3] || c[i] == a[4] ); // 和自身以及其他的数值做比较,防止重复数值
      a[i] = c[i];// 恢复自身的数据
   }   
   //printf("%d %d %d %d\n", c[1], c[2], c[3], c[4]);// 调试用   
   printf("请输入四位数字:\n");
   do
   {
      do
      {
         scanf("%d %d %d %d", &b[1], &b[2], &b[3], &b[4]);// 输入数值
         H = H + 1;
         for (i=1; i < 5; i++)
         {
      
            if (b[i] < 0 || b[i] >9)
            {printf("数据不合法\n");
            break;// 问题就在这里,为什么break 不能打断这个循环。。。如果打出来的是非0-9的整数,那么程序就会陷入一个死循环
            }            
         }
      }
      while (b[i] < 0 || b[i] >9);
      A = 0;// 注意每次循环都要清零
      B = 0;// 注意每次循环都要清零
      for (h = 1; h < 5; h++) // 判断位置提示(B)和位置以及值提示(A) 的循环
      {
         if (a[h] == b[h])
            A = A + 1;
         else
            for (i = 1; i < 5; i++)
            {
               if (a[h] == b[i])
                  B = B + 1;
            }
      }
      printf("A = %d, B = %d\n", A, B);
   }
   while (A != 4 ); // 如果A = 4 那么游戏胜利
   printf("一共%d次,真厉害!\n", H);
   return 0;
}
/*
---------------------------------------
正确的执行(随机的一个例子):
请输入四位数字:
1 2 3 4
A = 1,B = 0
5 6 7 8
A = 0,B = 3
1 2 3 9
A = 1,B = 0
2 1 9 0
A = 0,B = 1
1 0 9 4
A = 1,B = 0
1 5 6 7
A = 1,B = 3
1 7 5 6
A =4,B = 0
一共7次,真厉害!
Press any key to continue
-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=--=-=-=-
(在输入字符后的)错误执行:
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
(死循环)
。。。。。。
---------------------------------------
*/

作者: hardware   发布时间: 2011-04-18

break确实跳出内部for循环了,但scanf只在while循环第一次执行时读取了手动输入,如果都是字符,b不会被赋值
而且楼主所有的数组下标都是从1开始的……

作者: 灰色小狼   发布时间: 2011-04-18