鱼C论坛

 找回密码
 立即注册
查看: 2046|回复: 1

为什么这个不行

[复制链接]
发表于 2014-11-8 13:27:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么到最后scanf和goto都不执行了?:dizzy:
  1. #include<time.h>
  2. #include <windows.h>
  3. #include<stdlib.h>
  4. #include<stdio.h>
  5. #include<conio.h>

  6. main()
  7. {
  8.         //定义所需变量
  9.         int i, j[5], k[2], t, a, r;
  10.         char c;
  11.        
  12.         /*标号*/loop:        /*询问需要循环几次*/printf("你要几组号码? 请输入: ");
  13.         //输入次数
  14.         scanf("%d", &r);
  15.         //以时间设置随机数种子
  16.         srand( (unsigned)time( NULL ) );
  17.         //循环r次
  18.         for(a=1; a<=r; a++)
  19.         {
  20.                 //五个普通号,循环五次
  21.                 for(i=0;i<5;i++)
  22.                 {
  23.                         //产生1~35之间的随机数
  24.                         j[i]=1+(int)(35.0*rand()/(RAND_MAX+1.0));
  25.                         //从大到小输出:如果大于,就互换,最终变成从大到小
  26.                         if(j[0]<j[1]){t=j[0];j[0]=j[1];j[1]=t;}
  27.                         if(j[0]<j[2]){t=j[0];j[0]=j[2];j[2]=t;}
  28.                         if(j[0]<j[3]){t=j[0];j[0]=j[3];j[3]=t;}
  29.                         if(j[0]<j[4]){t=j[0];j[0]=j[4];j[4]=t;}
  30.                         if(j[1]<j[2]){t=j[1];j[1]=j[2];j[2]=t;}
  31.                         if(j[1]<j[3]){t=j[1];j[1]=j[3];j[3]=t;}
  32.                         if(j[1]<j[4]){t=j[1];j[1]=j[4];j[4]=t;}
  33.                         if(j[2]<j[3]){t=j[2];j[2]=j[3];j[3]=t;}
  34.                         if(j[2]<j[4]){t=j[2];j[2]=j[4];j[4]=t;}
  35.                         if(j[3]<j[4]){t=j[3];j[3]=j[4];j[4]=t;}
  36.                         //打印
  37.                         printf(" %d",j[i]);
  38.                         //为了美观,如果是一位数(小于十),就打印一个空格
  39.                         if(j[i]<10)
  40.                         {
  41.                                 //打印空格
  42.                                 putchar(' ');
  43.                         }
  44.                 }
  45.                 //准备打印特别号,说明一下
  46.                 printf("  特别号:");
  47.                 //两个特别号,循环两次
  48.                 for(i=0;i<2;i++)
  49.                 {
  50.                         //产生1~12之间的随机数
  51.                         k[i]=1+(int)(12.0*rand()/(RAND_MAX+1.0));
  52.                         //从大到小输出:如果大于,就互换,最终变成从大到小
  53.                         if(k[1]<k[0]){t=k[0];k[0]=k[1];k[1]=t;}
  54.                         if(k[0]<k[1]){t=k[1];k[1]=k[0];k[0]=t;}
  55.                         //打印
  56.                         printf(" %d",k[i]);
  57.                         //为了美观,如果是一位数(小于十),就打印一个空格
  58.                         if(k[i]<10)
  59.                         {
  60.                                 //打印空格
  61.                                 putchar(' ');
  62.                         }
  63.                 }
  64.                 //回车
  65.                 putchar('\n');
  66.         }
  67.         //回车
  68.         putchar('\n');
  69.         //询问需不需要继续选号
  70.         printf("你还要继续选号吗,需要请按“Y”,不需要请按“N”:");
  71.         //输入‘y’或‘n’
  72.         scanf("%c", &c);
  73.         //如果是‘y’或‘Y’就跳转到loop标识符,反之结束程序
  74.         if(c=='y' || c=='Y')
  75.         {
  76.                 //跳转到loop标识符
  77.                 goto loop;
  78.         }
  79.         //暂停屏幕
  80.         getch();
  81.         //返回值,结束程序
  82.         return 0;
  83. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-8 16:48:20 | 显示全部楼层
本帖最后由 Mortal 于 2014-11-8 16:56 编辑
  1. #include<time.h>
  2. #include <windows.h>
  3. #include<stdlib.h>
  4. #include<stdio.h>
  5. #include<conio.h>

  6. main()
  7. {
  8.         //定义所需变量
  9.         int i, j[5], k[2], t, a, r;
  10.         char c;
  11.         
  12.         /*标号*/loop:        /*询问需要循环几次*/printf("你要几组号码? 请输入: ");
  13.         //输入次数
  14.         scanf("%d", &r);
  15.         //以时间设置随机数种子
  16.         srand( (unsigned)time( NULL ) );
  17.         //循环r次
  18.         for(a=1; a<=r; a++)
  19.         {
  20.                 //五个普通号,循环五次
  21.                 for(i=0;i<5;i++)
  22.                 {
  23.                         //产生1~35之间的随机数
  24.                         j[i]=1+(int)(35.0*rand()/(RAND_MAX+1.0));
  25.                         //从大到小输出:如果大于,就互换,最终变成从大到小
  26.                         if(j[0]<j[1]){t=j[0];j[0]=j[1];j[1]=t;}
  27.                         if(j[0]<j[2]){t=j[0];j[0]=j[2];j[2]=t;}
  28.                         if(j[0]<j[3]){t=j[0];j[0]=j[3];j[3]=t;}
  29.                         if(j[0]<j[4]){t=j[0];j[0]=j[4];j[4]=t;}
  30.                         if(j[1]<j[2]){t=j[1];j[1]=j[2];j[2]=t;}
  31.                         if(j[1]<j[3]){t=j[1];j[1]=j[3];j[3]=t;}
  32.                         if(j[1]<j[4]){t=j[1];j[1]=j[4];j[4]=t;}
  33.                         if(j[2]<j[3]){t=j[2];j[2]=j[3];j[3]=t;}
  34.                         if(j[2]<j[4]){t=j[2];j[2]=j[4];j[4]=t;}
  35.                         if(j[3]<j[4]){t=j[3];j[3]=j[4];j[4]=t;}
  36.                         //打印
  37.                         printf(" %d",j[i]);
  38.                         //为了美观,如果是一位数(小于十),就打印一个空格
  39.                         if(j[i]<10)
  40.                         {
  41.                                 //打印空格
  42.                                 putchar(' ');
  43.                         }
  44.                 }
  45.                 //准备打印特别号,说明一下
  46.                 printf("  特别号:");
  47.                 //两个特别号,循环两次
  48.                 for(i=0;i<2;i++)
  49.                 {
  50.                         //产生1~12之间的随机数
  51.                         k[i]=1+(int)(12.0*rand()/(RAND_MAX+1.0));
  52.                         //从大到小输出:如果大于,就互换,最终变成从大到小
  53.                         if(k[1]<k[0]){t=k[0];k[0]=k[1];k[1]=t;}
  54.                         if(k[0]<k[1]){t=k[1];k[1]=k[0];k[0]=t;}
  55.                         //打印
  56.                         printf(" %d",k[i]);
  57.                         //为了美观,如果是一位数(小于十),就打印一个空格
  58.                         if(k[i]<10)
  59.                         {
  60.                                 //打印空格
  61.                                 putchar(' ');
  62.                         }
  63.                 }
  64.                 //回车
  65.                 putchar('\n');
  66.         }
  67.         //回车
  68.         putchar('\n');
  69.         //询问需不需要继续选号
  70.         printf("你还要继续选号吗,需要请按“Y”,不需要请按“N”:");

  71.                 fflush(stdin);                                                //因为第一次scanf 输入的是数字然后回车 缓冲区中存放的是数字与回车 数字给第一次的%d带走了 但是回车还在缓冲区
  72.                 //输入‘y’或‘n’
  73.         scanf("%c", &c);
  74.         //如果是‘y’或‘Y’就跳转到loop标识符,反之结束程序
  75.         if(c=='y' || c=='Y')
  76.         {
  77.                 //跳转到loop标识符
  78.                 goto loop;
  79.         }

  80.                 printf("程序结束, 请按任意键继续."); // 个人兴趣→v→

  81.                 //暂停屏幕
  82.         getch();
  83.         //返回值,结束程序
  84.         return 0;
  85. }
复制代码
第一次scanf("%d", &r);
我输入5[回车]
这时缓冲区内是'5', '0x10'
然后scanf将5给了r
但是缓冲区内'0x10'的数据还在
所以保留到了第一次
scanf("%c", &c);
输入y
这时缓冲区内是'0x10', 'y'
因为'0x10' 是一个字符 所以自然被收走了
然后就因为c的值='0x10' 自然就跳过了
还有外层可以用
  1. do
  2. {
  3.         ....
  4.         fflush(stdin); //清空缓冲区
  5.         scanf("%c", &c);
  6. }while(c == 'y' || c == 'Y');
复制代码
其实你一开始调试一次就知道了 断点在第二次的scanf之后一句话 会发现c的值是回车


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 13:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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