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

C语言Hangman游戏中字符串数组赋值问题求助

刽子手游戏C语言代码问题修复

核心问题分析

  • 未初始化指针导致崩溃:char *sTempArr;仅声明了指针,未指向有效内存空间,直接执行sTempArr[i] = '_';会访问非法内存,触发未定义行为(程序直接退出)。
  • 变长数组编译错误:char sTempArr[len]报错是因为编译器默认使用C89标准,该标准不支持变长数组(VLA)。C99及以后标准支持变长数组,但需编译器开启对应模式(比如GCC添加-std=c99参数)。

修复方案

推荐使用动态内存分配,兼容性更强,不受C版本限制:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main()
{
    srand(time(0));
    int random = rand() % 5;

    char *sWords[] = {"banana", "apple", "GOAT", "jordan", "zhiki"};
    char *sTempWord = sWords[random];
    printf("选中的单词:%s\n", sTempWord);

    // 获取单词长度,+1用于存储字符串终止符'\0'
    int wordLen = strlen(sTempWord);
    // 分配内存,必须检查分配是否成功
    char *sTempArr = malloc(wordLen + 1);
    if (sTempArr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 填充下划线并添加终止符
    for (int i = 0; i < wordLen; i++) {
        sTempArr[i] = '_';
    }
    sTempArr[wordLen] = '\0';

    // 打印猜测状态
    printf("当前猜测状态:");
    for (int i = 0; i < wordLen; i++) {
        printf("%c ", sTempArr[i]);
    }
    printf("\n");

    // 释放动态分配的内存,避免泄漏
    free(sTempArr);
    return 0;
}

额外说明

  1. 动态内存分配优势:malloc可在运行时根据单词长度分配内存,兼容所有C标准,还能避免栈内存溢出(针对长单词场景)。
  2. 变长数组替代方案:若编译器支持C99+,也可使用变长数组,不过栈空间有限,不适合过长单词:
int wordLen = strlen(sTempWord);
char sTempArr[wordLen + 1]; // C99及以后支持
memset(sTempArr, '_', wordLen);
sTempArr[wordLen] = '\0';

用memset可高效填充下划线,替代循环操作。
3. 原代码其他问题:原第二个循环for (int i = 0; strlen(sTempArr); i++)会因sTempArr无终止符导致strlen计算错误,甚至死循环,修复后直接用单词长度循环更安全高效。

内容的提问来源于stack exchange,提问作者Zivko Stoimcev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:10:34