C语言Hangman猜词游戏首次运行额外打印下划线问题求助
Hangman游戏首屏多显示下划线问题排查
问题根因
- 核心原因1:
fgets读取单词行时,会将行末的换行符\n一同读入字符串中,导致strlen(string)计算出的单词长度比实际多1,多出来的这一位字符是\n,首次打印下划线时就会多输出一个。 - 核心原因2:
scanf("%c", &c)读取用户输入时,只会读取输入的字母,用户按下的回车换行符会残留在输入缓冲区中,下一次进入输入逻辑时会直接读取这个残留换行符,导致后续逻辑异常。 - 额外错误:
srand((unsigned) time(NULL))放在了死循环内部,短时间内连续开新局会因为时间戳相同导致随机种子一致,选出的单词重复。
修复方案
1. 去除读取单词末尾的换行符
在fgets(part, sizeof part, file);之后添加代码,替换掉末尾的换行符:
fgets(part, sizeof part, file); part[strcspn(part, "\n")] = '\0'; // 新增这行,去掉末尾换行符
2. 修复输入缓冲区残留问题
将读取字符的scanf代码修改为,在%c前加空格跳过空白字符:
scanf(" %c", &c); // %c前加空格,自动跳过残留的换行、空格等空白字符
3. 优化随机种子初始化
把srand((unsigned) time(NULL));移动到main函数最开头,死循环外部,全局只初始化一次即可。
内容的提问来源于stack exchange,提问作者Checken
相关产品推荐
相关产品推荐

