C语言开发hangman游戏时scanf语句被直接跳过问题求助
问题根因
scanf使用%c格式符时不会自动跳过输入缓冲区中的空白字符(包括换行符\n、空格等),你之前调用fscanf读取单词、以及每次循环输出操作后,输入缓冲区残留的换行符会被下一次scanf("%c")直接读取,就会出现看起来跳过用户输入的现象。- 你当前用
strstr判断字符是否存在于单词中的逻辑存在错误:strstr要求入参是\0结尾的字符串,你传入单个字符变量的地址&choice,该地址后续没有自动补的\0结束符,会导致strstr越界访问内存,判断结果完全不可预期。 - 额外的小问题:你定义的
GAME_OVER宏值为0,while(!GAME_OVER)等价于死循环,后续可以补充猜错计数逻辑来触发出局条件。
修复方案
按以下步骤修改即可解决输入跳过的问题:
- 给
scanf的%c格式符前添加空格,用来自动跳过所有前置空白字符,修改前为scanf("%c", &choice),修改后为scanf(" %c", &choice),注意%c前的空格不能省略。 - 将字符匹配逻辑从
strstr替换为专门用来匹配单个字符的strchr函数,无需传字符地址,直接传choice变量即可。 - 规范
fscanf的写法:数组名本身就是首地址,无需加取地址符,将fscanf(file, "%s", &word)改为fscanf(file, "%s", word)。
修改后的核心宏定义参考:
#define choice() printf("Your Choice? "); scanf(" %c", &choice); if(strchr(word, choice) != NULL){printf("ok\n");}
内容的提问来源于stack exchange,提问作者Guven Kerem
相关产品推荐
相关产品推荐

