C语言刽子手(Hangman)游戏字符匹配异常问题求助:错误匹配字符且字符串长度异常
问题分析与修复方案
咱们来拆解下你这个刽子手游戏代码里导致异常输出的核心问题,再给出针对性的修复方案:
1. 核心问题根源
变长数组初始化错误
你在声明hidden[size]时,size的初始值是0,这就导致这个数组的大小被固定为0了。虽然你后面通过循环计算出了word的实际长度,但hidden的内存空间已经确定,后续往hidden[i]赋值的操作全是越界访问内存——这会破坏其他变量的内存区域,就是你看到输出变成a__a、长度不对的根本原因。
字符串缺少结束符
C语言的字符串必须以'\0'作为结尾标记,否则printf("%s")会一直读取内存,直到碰到随机的'\0',这也会加剧输出内容的异常。
修复后的完整代码
#include <stdio.h> #include <string.h> // 引入strlen函数,更便捷地获取字符串长度 int main() { char word[] = "apple"; int size = strlen(word); // 直接获取目标单词的长度 char guess; char hidden[size + 1]; // 多预留一个位置存放字符串结束符 // 初始化hidden为下划线,并添加结束符 for (int i = 0; i < size; ++i) { hidden[i] = '_'; } hidden[size] = '\0'; // 必须手动添加字符串结束标记 while (1) { printf("%s\n", hidden); scanf(" %c", &guess); for (int y = 0; y < size; ++y) { if (word[y] == guess) { hidden[y] = guess; } } } return 0; }
关键修复点说明
- 提前获取有效长度:用
strlen(word)直接拿到目标单词的长度,既简洁又避免了手动循环的潜在错误,而且声明hidden数组时size已经是正确值,不会再出现0长度数组的问题。 - 预留结束符空间:声明
hidden[size + 1],最后手动添加hidden[size] = '\0',确保printf能正确识别字符串的结尾,不会读取垃圾内存。 - 避免内存越界:现在
hidden的大小刚好能容纳所有下划线和结束符,越界写内存的问题彻底解决,输出就能符合预期了。
你可以试试这段代码,输入a后应该会输出a____,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Omar Khader
相关产品推荐
相关产品推荐

