墨多多 发表于 2014-11-8 13:27:55

为什么这个不行

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

main()
{
        //定义所需变量
        int i, j, k, t, a, r;
        char c;
       
        /*标号*/loop:        /*询问需要循环几次*/printf("你要几组号码? 请输入: ");
        //输入次数
        scanf("%d", &r);
        //以时间设置随机数种子
        srand( (unsigned)time( NULL ) );
        //循环r次
        for(a=1; a<=r; a++)
        {
                //五个普通号,循环五次
                for(i=0;i<5;i++)
                {
                        //产生1~35之间的随机数
                        j=1+(int)(35.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        //打印
                        printf(" %d",j);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(j<10)
                        {
                                //打印空格
                                putchar(' ');
                        }
                }
                //准备打印特别号,说明一下
                printf("特别号:");
                //两个特别号,循环两次
                for(i=0;i<2;i++)
                {
                        //产生1~12之间的随机数
                        k=1+(int)(12.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(k<k){t=k;k=k;k=t;}
                        if(k<k){t=k;k=k;k=t;}
                        //打印
                        printf(" %d",k);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(k<10)
                        {
                                //打印空格
                                putchar(' ');
                        }
                }
                //回车
                putchar('\n');
        }
        //回车
        putchar('\n');
        //询问需不需要继续选号
        printf("你还要继续选号吗,需要请按“Y”,不需要请按“N”:");
        //输入‘y’或‘n’
        scanf("%c", &c);
        //如果是‘y’或‘Y’就跳转到loop标识符,反之结束程序
        if(c=='y' || c=='Y')
        {
                //跳转到loop标识符
                goto loop;
        }
        //暂停屏幕
        getch();
        //返回值,结束程序
        return 0;
}

Mortal 发表于 2014-11-8 16:48:20

本帖最后由 Mortal 于 2014-11-8 16:56 编辑

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

main()
{
      //定义所需变量
      int i, j, k, t, a, r;
      char c;
      
      /*标号*/loop:      /*询问需要循环几次*/printf("你要几组号码? 请输入: ");
      //输入次数
      scanf("%d", &r);
      //以时间设置随机数种子
      srand( (unsigned)time( NULL ) );
      //循环r次
      for(a=1; a<=r; a++)
      {
                //五个普通号,循环五次
                for(i=0;i<5;i++)
                {
                        //产生1~35之间的随机数
                        j=1+(int)(35.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        if(j<j){t=j;j=j;j=t;}
                        //打印
                        printf(" %d",j);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(j<10)
                        {
                              //打印空格
                              putchar(' ');
                        }
                }
                //准备打印特别号,说明一下
                printf("特别号:");
                //两个特别号,循环两次
                for(i=0;i<2;i++)
                {
                        //产生1~12之间的随机数
                        k=1+(int)(12.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(k<k){t=k;k=k;k=t;}
                        if(k<k){t=k;k=k;k=t;}
                        //打印
                        printf(" %d",k);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(k<10)
                        {
                              //打印空格
                              putchar(' ');
                        }
                }
                //回车
                putchar('\n');
      }
      //回车
      putchar('\n');
      //询问需不需要继续选号
      printf("你还要继续选号吗,需要请按“Y”,不需要请按“N”:");

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

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

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


页: [1]
查看完整版本: 为什么这个不行