C語言scanf執行時被跳過
阿新 • • 發佈:2017-12-31
null 是個 ase 程序 一輪 發現 控制 cas logs
運行到第二次開始遊戲時,發現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");
}
C語言scanf執行時被跳過