为什么这个不行
为什么到最后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: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]