如何在Hangman游戏中使用scanf仅读取用户输入的首个字符?
解决Hangman游戏中scanf读取多字符的问题
你的问题出在输入缓冲区未清空:当用户输入moo并回车后,输入缓冲区里会残留oo\n,循环里的下几次scanf会直接读取这些残留字符,导致一次输入触发多次猜测。下面给两种解决办法:
方法一:读取单个字符后清空缓冲区
在读取目标字符后,用循环把缓冲区里剩余的字符全部读完,直到遇到换行符或EOF:
#include <stdio.h> // ... 其他代码 char guessed_letter; printf("\n"); // 读取第一个非空白字符(前面的空格跳过换行、空格等空白) scanf(" %c", &guessed_letter); // 清空输入缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF);
方法二:用fgets读取整行再取第一个字符
这种方法更安全,能避免输入过长导致的缓冲区溢出问题,同时直接忽略整行里除第一个有效字符外的所有内容:
#include <stdio.h> #include <ctype.h> // 用于isspace函数 // ... 其他代码 char input[100]; char guessed_letter; printf("\n"); // 读取整行输入 fgets(input, sizeof(input), stdin); // 跳过前面的空白字符(空格、换行等),找到第一个有效字符 int i = 0; while (input[i] != '\0' && isspace(input[i])) { i++; } // 如果找到有效字符,赋值给guessed_letter if (input[i] != '\0') { guessed_letter = input[i]; }
两种方法都能确保每次只处理用户输入的第一个有效字符,后续输入会被直接丢弃,不会影响下一次猜测循环。
内容的提问来源于stack exchange,提问作者Basel Eyad
相关产品推荐
相关产品推荐

