C语言scanf执行时被跳过


运行到第二次开始游戏时,发现GameJudge函数中的scanf无法从键盘中输入数据
这种情况的出现是因为用户在输入结束时都会敲一下回车键才能让程序继续执行,
但是,每次printf会从用户输入缓冲区取出用户输入的内容,这样就会在缓冲区留下回车键,
下一次输入如果是获取一个字符,就会将缓冲区剩余的回车键取出。

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

//定义全局变量
int InputNumber = 0;//输入的数字
char Game;//输入的指令
int s = 0;//游戏循环的控制

//输入是否开始游戏的指令
int GameJudge(void)
{
	printf("输入Y开始游戏\n输入N退出游戏\n");//不用区分大小写
	printf("请输入指令:");
	setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区
	scanf("%c",&Game);//
	//fflush(stdin);//清除缓冲区 这个貌似没有用,用setbut代替了
	Game  = toupper(Game);
	switch(Game)
	{
		case 'Y' : s = 1;break;
		case 'N' : s = 0;break;
		default : s = 0;break;
	}
	return s;
}

//判断输入的数字是否符合要求
int JudgeNumber( int x)
{
	int n;
	if((x>=0)&&(x<=9)){n = 1;}
	else{n = 0;}
	return n;
}

//产生随机数,
int RandomNumber(void)
{
	int number;
	srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
	number = rand() % 10; //产生0-100的随机数
	return number;
}

//输入数字,并判断是否符合要求
int Input(void)
{
	do
		{
			printf("请输入你的答案:");
			scanf("%d",&InputNumber);
		}
		while(!JudgeNumber(InputNumber));
		return InputNumber;
}

//游戏的主体
int main()
{
	int i = 0;
	int number;//定义随机数
	int Score = 1;//得分计算
	int  j = 1;

	number = RandomNumber();
	s = GameJudge();

	while(s)//游戏的循环体
	{
		InputNumber = Input();
		do
		{
			if(InputNumber == number)
			{
				j = 0;
			}
			else
			{
				printf("你猜错了!\n请重新输入\n");
				Score  ++;
				InputNumber = Input();
			}
		}
		while(j);
		switch(Score)
		{
			case 1 : printf("你真是我肚子里的蛔虫!!!\n");	break;
			case 2 : printf("你还真是有点二呀!!!\n" );	break;
			case 3 : printf("哼,不理你了!!!\n" );	break;
			default : printf("你就是个大笨蛋!!!\n" );	break;
		}
		Score = 1;//一轮游戏结束,初始化Score
		system("cls");//清屏
		s = GameJudge();
	}
	system("pause");

}



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM