C语言编写Hangman游戏调用runGame()后主函数无输出异常排查
Hangman游戏运行异常问题排查
核心问题原因
- 输出无显示:C标准输出默认采用行缓冲机制,你代码中
printf("uh")、printf("hey")等测试输出没有加换行符\n,内容会暂存在输出缓冲区不会刷到终端,程序后续触发异常后缓冲区内容直接丢失,所以看不到任何输出。 - 程序卡死/无响应的核心原因是缓冲区溢出触发未定义行为:
runGame函数中定义的char guesses_made[10];未初始化,数组内是随机垃圾值,直接调用字符串操作函数行为不可控。- 调用
strcat(guesses_made, &player_guess)时,第二个参数&player_guess只是单个字符的地址,尾部没有C字符串必需的\0结束符,strcat会持续越界访问内存找结束符,直接破坏程序栈结构,导致程序跑飞、死循环或者直接崩溃。
- 其他逻辑错误:
- 随机种子初始化时机错误:
srand(time(NULL))放在了runGame调用之后,runGame中调用randomWord用到的rand()函数使用默认固定种子,生成的随机数是固定序列。 - 随机单词获取逻辑错误:每次外层循环先把随机单词拷贝到
rand_word,计算长度时又调用了一次randomWord,拿到的是新单词的长度,和当前使用的单词长度不匹配;且猜字符的逻辑中,每遍历到一个不匹配的字符就给man_hung加1,会导致man_hung数值异常飙升。 - 内存泄漏:
randomWord返回的strdup分配的堆内存没有主动释放,长期运行会占用多余内存。
- 随机种子初始化时机错误:
修复建议
- 所有测试用的
printf结尾加\n,或者在需要立即输出的位置调用fflush(stdout)刷新缓冲区。 - 把
main函数中的srand(time(NULL))移动到runGame调用之前,保证随机数种子正常初始化。 - 初始化
guesses_made数组:定义时直接写成char guesses_made[10] = {0};保证初始为空字符串。 - 不要用
strcat追加单个字符,改成手动赋值:比如int len = strlen(guesses_made); if (len < 9) { guesses_made[len] = player_guess; guesses_made[len+1] = '\0'; },避免越界。 - 调整猜字符的逻辑:判断是否匹配时只遍历一次单词,只要存在一个匹配就不算猜错,仅完全不匹配时给
man_hung加1。 rand_word_len直接用strlen(rand_word)计算,不要重复调用randomWord获取。- 每次用完
randomWord返回的字符串后调用free释放对应内存。
内容的提问来源于stack exchange,提问作者Farha Mohammed Al-Farsy
相关产品推荐
相关产品推荐

