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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:43:13