You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言编写Hangman游戏调用runGame()后主函数无输出异常排查

Hangman游戏运行异常问题排查

核心问题原因

  • 输出无显示:C标准输出默认采用行缓冲机制,你代码中printf("uh")、printf("hey")等测试输出没有加换行符\n,内容会暂存在输出缓冲区不会刷到终端,程序后续触发异常后缓冲区内容直接丢失,所以看不到任何输出。
  • 程序卡死/无响应的核心原因是缓冲区溢出触发未定义行为:
    1. runGame函数中定义的char guesses_made[10];未初始化,数组内是随机垃圾值,直接调用字符串操作函数行为不可控。
    2. 调用strcat(guesses_made, &player_guess)时,第二个参数&player_guess只是单个字符的地址,尾部没有C字符串必需的\0结束符,strcat会持续越界访问内存找结束符,直接破坏程序栈结构,导致程序跑飞、死循环或者直接崩溃。
  • 其他逻辑错误:
    1. 随机种子初始化时机错误:srand(time(NULL))放在了runGame调用之后,runGame中调用randomWord用到的rand()函数使用默认固定种子,生成的随机数是固定序列。
    2. 随机单词获取逻辑错误:每次外层循环先把随机单词拷贝到rand_word,计算长度时又调用了一次randomWord,拿到的是新单词的长度,和当前使用的单词长度不匹配;且猜字符的逻辑中,每遍历到一个不匹配的字符就给man_hung加1,会导致man_hung数值异常飙升。
    3. 内存泄漏: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:09:01