用scanf()读取字符

此代码适用于掷骰子游戏

#include  #include  #include  #include  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它工作正常。
这有什么问题吗?
我访问了这个post ,它说的是我做过的同样的事情。

发布的代码具有未定义的行为,因为ch的类型为int ,格式说明符%c必须与char匹配。

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

切换到%dscanf()失败,因为Yy不是int ,因此不会消耗任何输入(除了在循环的后续迭代中丢弃新行字符的前导空格)和随后的ch = getchar()实际读取用户输入的字符,代码由fluke工作。 始终检查scanf()的返回值,它返回所做的赋值数。

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

顺便说一句,使用" %c"的空格。

 scanf("%c", &ch); ch = getchar(); 

这就是你丢失以前存储在ch char的方式。 怎么样

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

代替?

 printf("Play again? "); scanf(" %c", &char); 

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