鱼C论坛

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

为什么这个不行

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

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

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

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

main()
{
        //定义所需变量
        int i, j[5], k[2], 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[i]=1+(int)(35.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(j[0]<j[1]){t=j[0];j[0]=j[1];j[1]=t;}
                        if(j[0]<j[2]){t=j[0];j[0]=j[2];j[2]=t;}
                        if(j[0]<j[3]){t=j[0];j[0]=j[3];j[3]=t;}
                        if(j[0]<j[4]){t=j[0];j[0]=j[4];j[4]=t;}
                        if(j[1]<j[2]){t=j[1];j[1]=j[2];j[2]=t;}
                        if(j[1]<j[3]){t=j[1];j[1]=j[3];j[3]=t;}
                        if(j[1]<j[4]){t=j[1];j[1]=j[4];j[4]=t;}
                        if(j[2]<j[3]){t=j[2];j[2]=j[3];j[3]=t;}
                        if(j[2]<j[4]){t=j[2];j[2]=j[4];j[4]=t;}
                        if(j[3]<j[4]){t=j[3];j[3]=j[4];j[4]=t;}
                        //打印
                        printf(" %d",j[i]);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(j[i]<10)
                        {
                                //打印空格
                                putchar(' ');
                        }
                }
                //准备打印特别号,说明一下
                printf("  特别号:");
                //两个特别号,循环两次
                for(i=0;i<2;i++)
                {
                        //产生1~12之间的随机数
                        k[i]=1+(int)(12.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(k[1]<k[0]){t=k[0];k[0]=k[1];k[1]=t;}
                        if(k[0]<k[1]){t=k[1];k[1]=k[0];k[0]=t;}
                        //打印
                        printf(" %d",k[i]);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(k[i]<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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[5], k[2], 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[i]=1+(int)(35.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(j[0]<j[1]){t=j[0];j[0]=j[1];j[1]=t;}
                        if(j[0]<j[2]){t=j[0];j[0]=j[2];j[2]=t;}
                        if(j[0]<j[3]){t=j[0];j[0]=j[3];j[3]=t;}
                        if(j[0]<j[4]){t=j[0];j[0]=j[4];j[4]=t;}
                        if(j[1]<j[2]){t=j[1];j[1]=j[2];j[2]=t;}
                        if(j[1]<j[3]){t=j[1];j[1]=j[3];j[3]=t;}
                        if(j[1]<j[4]){t=j[1];j[1]=j[4];j[4]=t;}
                        if(j[2]<j[3]){t=j[2];j[2]=j[3];j[3]=t;}
                        if(j[2]<j[4]){t=j[2];j[2]=j[4];j[4]=t;}
                        if(j[3]<j[4]){t=j[3];j[3]=j[4];j[4]=t;}
                        //打印
                        printf(" %d",j[i]);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(j[i]<10)
                        {
                                //打印空格
                                putchar(' ');
                        }
                }
                //准备打印特别号,说明一下
                printf("  特别号:");
                //两个特别号,循环两次
                for(i=0;i<2;i++)
                {
                        //产生1~12之间的随机数
                        k[i]=1+(int)(12.0*rand()/(RAND_MAX+1.0));
                        //从大到小输出:如果大于,就互换,最终变成从大到小
                        if(k[1]<k[0]){t=k[0];k[0]=k[1];k[1]=t;}
                        if(k[0]<k[1]){t=k[1];k[1]=k[0];k[0]=t;}
                        //打印
                        printf(" %d",k[i]);
                        //为了美观,如果是一位数(小于十),就打印一个空格
                        if(k[i]<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的值是回车


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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