[英]Reading character with scanf()
此代碼適用於擲骰子游戲 。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int roll_dice(void);
bool play_game(void);
int main()
{
int i, ch,win = 0,lose = 0;
bool flag;
srand((unsigned)time(NULL));
do
{
flag = play_game();
if(flag)
{
printf("You win!");
win++;
}
else
{
printf("You lose!");
lose++;
}
printf("\n\nPlay again(Y/N)? ");
scanf("%c", &ch);
ch = getchar();
printf("\n");
}while(ch == 'Y' || ch == 'y');
printf("\nWins: %d Losses: %d",win,lose);
return 0;
}
int roll_dice(void)
{
return rand()%6 + rand()%6 + 2;
}
bool play_game(void)
{
int sum = roll_dice();
printf("You rolled: %d\n", sum);
if(sum == 7 || sum == 11)
return 1;
else if(sum == 2 || sum == 3 || sum == 12)
return 0;
else
{
int point = sum;
printf("Your point is: %d\n", point);
do
{
sum = roll_dice();
printf("You rolled: %d\n", sum);
if(sum == 7)
return 0;
}while(point != sum);
return 1;
}
}
我只有代碼片段有問題
printf("\n\nPlay again(Y/N)? ");
scanf("%c", &ch);
ch = getchar();
printf("\n");
我已經使用過,因為無論用戶輸入Y
還是N
,它都會在一次迭代后終止。 我認為我做錯了是把ch = getchar()
吃掉了\\n
,我刪除它並在轉換說明符之前放置一個空格並用" %c"
替換它也沒用。當我替換轉換說明符時%d
它工作正常。
這有什么問題嗎?
我訪問了這個帖子 ,它說的是同樣的事情。
發布的代碼具有未定義的行為,因為ch
的類型為int
,格式說明符%c
必須與char
匹配。
當我替換轉換說明符%d時,它工作正常。
切換到%d
, scanf()
失敗,因為Y
或y
不是int
,因此不會消耗任何輸入(除了在循環的后續迭代中丟棄新行字符的前導空格)和隨后的ch = getchar()
實際讀取用戶輸入的字符,代碼由fluke工作。 始終檢查scanf()
的返回值,該值返回所作的分配數。
scanf("%c", &ch);
ch = getchar();
這就是你丟失以前存儲在ch
char的方式。 怎么樣
ch = fgetc(stdin);
while (fgetc(stdin) != '\n')
;
代替?
您使用scanf
()轉換字符,然后立即用getchar
()覆蓋它。 我不希望它工作,除非你在輸入ENTER之前鍵入“yy”,但那么你的第二次確認將失敗。
順便說一句,使用" %c"
的空格。
printf("Play again? ");
scanf(" %c", &char);
這段代碼適合我。 該項目來自KNKing的“C編程:現代方法”一書。 我之前遇到過這個問題並遇到了同樣的問題。 在頁224上有一個guess.c示例項目,其中包含完全相同的命令“ask”(“再次播放”)。 作者使用了scanf(“%c”,&command); (他使用命令而不是ch)它確實有效。 我記得我在“擲骰子游戲”項目中使用它但它沒有用。 可能我錯過了一些東西。 總的來說,100%以上的表達確實有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.