C语言猜拳游戏循环问题求助:输入y重启游戏失败
问题分析与修复方案
问题出在C语言的输入缓冲区残留换行符上:scanf读取字符时不会自动跳过输入后的换行,这些残留的换行会被下一次scanf直接读取,导致程序跳过你的输入提示。
给你两种可行的修复方案:
方案一:在%c前添加空格
scanf的格式控制符里,%c前的空格会让它自动跳过所有空白字符(包括换行、空格、制表符),直接读取有效输入字符,完美避开残留换行的问题。修改所有读取字符的scanf语句即可:
#include<stdio.h> int main (){ char firstPlayer, secondPlayer, again; do{ printf("Jack 'n Poy\nEnter Player 1 input: "); scanf(" %c", &firstPlayer); // %c前添加空格 printf("Enter Player 2 input: "); scanf(" %c", &secondPlayer); // 同样添加空格 switch (firstPlayer){ case 'x': switch (secondPlayer){ case 'x': printf("Draw"); break; case 's': printf("Player 2 wins"); break; case 'p': printf("Player 1 wins"); } break; case 's': switch (secondPlayer){ case 'x': printf("Player 1 wins"); break; case 's': printf("Draw"); break; case 'p': printf("Player 2 wins"); } break; case 'p': switch (secondPlayer){ case 'x': printf("Player 2 wins"); break; case 's': printf("Player 1 wins"); break; case 'p': printf("Draw"); } break; default: printf("Invalid input"); } printf("\nPlay again? (y/n)"); scanf(" %c", &again); // 此处也添加空格 } while (again == 'y'); printf("Thank you for playing"); return 0; }
方案二:手动清理输入缓冲区
每次用scanf读取字符后,调用循环把缓冲区里的残留字符(直到换行)全部清空,彻底避免残留字符影响下一次输入:
#include<stdio.h> int main (){ char firstPlayer, secondPlayer, again; do{ printf("Jack 'n Poy\nEnter Player 1 input: "); scanf("%c", &firstPlayer); while(getchar() != '\n'); // 清理缓冲区到换行符为止 printf("Enter Player 2 input: "); scanf("%c", &secondPlayer); while(getchar() != '\n'); // 同样清理缓冲区 switch (firstPlayer){ case 'x': switch (secondPlayer){ case 'x': printf("Draw"); break; case 's': printf("Player 2 wins"); break; case 'p': printf("Player 1 wins"); } break; case 's': switch (secondPlayer){ case 'x': printf("Player 1 wins"); break; case 's': printf("Draw"); break; case 'p': printf("Player 2 wins"); } break; case 'p': switch (secondPlayer){ case 'x': printf("Player 2 wins"); break; case 's': printf("Player 1 wins"); break; case 'p': printf("Draw"); } break; default: printf("Invalid input"); } printf("\nPlay again? (y/n)"); scanf("%c", &again); while(getchar() != '\n'); // 清理最后一次输入的缓冲区 } while (again == 'y'); printf("Thank you for playing"); return 0; }
额外说明
你原代码中第一个scanf("%c ", &firstPlayer);后面的空格会导致scanf等待非空白字符,反而会加重输入混乱,所以直接去掉该空格,改用上面两种方案之一即可。
内容的提问来源于stack exchange,提问作者Mr. Skadoosh
相关产品推荐
相关产品推荐

