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; }
额外说明
- 动态内存分配优势:
malloc可在运行时根据单词长度分配内存,兼容所有C标准,还能避免栈内存溢出(针对长单词场景)。 - 变长数组替代方案:若编译器支持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
相关产品推荐
相关产品推荐

