C语言 猜数字程序

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char ch;
int i,a,c;
printf("猜数字游戏\n\n");
{srand(time(NULL));
i=(rand()%10);
printf("请输入数字\n\n");
do
{
scanf("%d",&a);
if(i>a)printf("小了\n");
if(i<a)printf("大了\n");
if(i==a){printf("你猜对了!\n");
printf("按n退出,按y继续\n");}
}while(ch=getchar()!='n');
}
}

这个程序进行第二次游戏时
输入y不是进行循环,而是输出 你猜对了!
应该怎么改?

原因分析:
“scanf("%d",&a);”这一行,输入完一个数字后,你还必须按下回车键,所以这行执行完毕后缓冲区就还留着一个'\n'字符即回车字符。执行到“}while(ch=getchar()!='n');”时,这字符就直接赋给了ch(验证方法:把“while(ch=getchar()!='n');”改为“while(ch=getchar()!='\n');”,你会发现输入一个数字后程序就直接结束了)。

对症下药:
方案一:“scanf("%d",&a);”这一行后加上“fflush(stdin);”(作用:清空输入流)。但这样改有个麻烦,就是你每次输入一个数字后你都还得因要执行getchar()而再输入一个字符。

方案二:“}while(ch=getchar()!='n');”改为“}while(ch=getch()!
='n');”(getch()会自动跳过前导的回车字符),这样改也有个类似方案一的麻烦,就是输入一个数字后你还得按一个键后方能再输入数字。

方案三:进行代码优化:(顺便说下,你的代码可读性有些问题,和下面的对照下吧)
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char ch;
int i,a;
printf("猜数字游戏\n\n");
srand(time(NULL));
i=rand()%10;
printf("请输入数字\n\n");
while(1)
{
scanf("%d",&a);
if(i>a) printf("小了\n");
if(i<a) printf("大了\n");
if(i==a)
{
printf("你猜对了!\n");
printf("按n退出,按y继续\n");
fflush(stdin);//清空输入流
if(getchar()=='n') break;
i=rand()%10;//重新随机答案
}
}
}
给分吧,花了我老半天时间呢!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-19
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char ch;
int i,a,c;
printf("猜数字游戏\n\n");
{srand(time(NULL));
i=(rand()%10);
printf("请输入数字\n\n");
do
{
scanf("%d",&a);
if(i>a)printf("小了\n");
if(i<a)printf("大了\n");
if(i==a){printf("你猜对了!\n");
printf("按n退出,否则继续输入数字进行猜数\n");
i=(rand()%10);}
}while(ch=getchar()!='n');
}
}
第2个回答  2010-10-04
你先拿5来测试看符合不符合你的要求。测试好了再把i=5;去掉。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char ch;
int i,a,c;
printf("Welcome to guess the number\n\n^_^ \n\n");
{srand(time(NULL));
i=(rand()%10);
i=5;

do
{
printf("\nPlease guess the number = ");
scanf("%d",&a);
if(i>a)printf("Sorry, it's smaller\n");
if(i<a)printf("Sorry, it's bigger\n");
if(i==a)
{
printf("\nCongratulations! You got it! ^_^\n");
printf("--------------------------------------\n");
printf("Press n to quit, press y to continue : ");
ch=getch();
printf("\n\n");
}
}while(ch!='n');
}
}
第3个回答  2010-10-04
do{
// ...
}while((ch=getchar())!='n');
赋值号的优先级低于不等判断,所以要加括号。