4

此代码用于掷骰子游戏

#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");

我使用过,因为无论用户输入什么YN. ch = getchar()我以为我通过放置吃起来做错了\n,我将其删除并在转换说明符之前放置了一个空格并将其替换为" %c"它也不起作用。当我用它替换转换说明符%d时工作正常。
这有什么问题吗?
我访问了这篇文章,它说的和我做的一样。

4

4 回答 4

4

发布的代码具有未定义的行为,因为ch它是类型int并且格式说明符%c必须与char.

当我替换转换说明符 %d 时,它工作正常。

当您切换到%d失败scanf()时,因为Yy不是int,所以不消耗任何输入(除了在循环的后续迭代中丢弃换行符的前导空格)并且后续ch = getchar()实际读取用户输入的字符,并且代码有效侥幸。始终检查 的返回值scanf(),它返回所做的分配数。

于 2013-07-05T21:56:04.590 回答
3
scanf("%c", &ch);
ch = getchar();

这就是您丢失存储在ch. 怎么样

ch = fgetc(stdin);
while (fgetc(stdin) != '\n')
    ;

反而?

于 2013-07-05T21:36:15.217 回答
3

用 () 转换字符scanf,然后getchar立即用 () 覆盖它。我不希望它起作用,除非您在输入 ENTER 之前输入“yy”,但是您的第二次确认将失败。

顺便说一句,使用" %c".

于 2013-07-05T21:40:57.113 回答
2
printf("Play again? ");
scanf(" %c", &char);

这段代码对我有用。该项目来自 KNKing 的“C 编程:一种现代方法”一书。我以前遇到过这个问题并且遇到了同样的问题。在第 224 页有一个guess.c 示例项目,其中包含完全相同的命令“ask”(“play again”)。并且作者使用了 scanf(" %c", &command); (他使用命令而不是 ch)并且它确实有效。我记得我在“掷骰子游戏”项目中使用过它,但它没有用。可能我错过了什么。总的来说,100% 以上的表达式确实有效。

于 2013-07-20T04:30:17.260 回答