C语言中如何将函数返回的字符串数组赋值给新数组?代码调试求助
问题分析与解决方案
原代码的核心问题
- 返回值错误:
questions()函数返回*er,实际只返回了数组第一个元素(即第一个字符串的指针),而非整个字符串数组的指针,导致erts无法拿到完整题库。 - 类型不匹配与非法内存访问:
main中erts定义为char*,循环里erts[i]取的是单个字符,用%s打印时会把该字符值当作内存地址,触发非法内存访问,这就是程序崩溃、无输出的原因(退出码3221225477对应Windows下的内存访问违规)。
修正代码(传递完整数组)
1. 修改questions()函数的返回类型
将返回类型改为char**(指向字符串指针的指针),直接返回数组名er(数组名会自动退化为指向第一个元素的指针):
#include <stdio.h> #include <stdlib.h> #include <time.h> char** questions(){ static char* er[10] = { "2+2", //ans 4 "4-5", //ans -1 "10*10", //ans 100 "17*3", //ans 51 "9/3", //ans 3 "45+24+35-68", //ans 36 "4-2", //ans 2 "592-591", //ans 1 "8+3", //ans 11 "9*9" //answer 81 }; return er; }
2. 调整main函数的变量类型与逻辑
把erts定义为char**,即可接收完整的字符串数组指针,同时实现随机选取5道不重复题目的需求:
int main() { int i, idx; char **erts; int selected[5] = {-1}; // 存储已选题目索引,初始化为无效值 srand(time(NULL)); // 用当前时间初始化随机数种子,保证每次运行结果不同 erts = questions(); // 随机选取5道不重复的题目 for(i = 0; i<5; i++){ do { idx = rand() % 10; // 生成0-9的随机索引 // 检查当前索引是否已被选中 int is_duplicate = 0; for(int j=0; j<i; j++){ if(selected[j] == idx){ is_duplicate = 1; break; } } if(!is_duplicate){ selected[i] = idx; break; } } while(1); printf("第%d题:%s\n", i+1, erts[selected[i]]); } return 0; }
关键说明
char**类型匹配字符串数组的指针类型,通过erts[i]可以直接访问题库中的第i道题。- 随机选题目时,通过循环去重避免重复出题,
srand(time(NULL))确保每次运行的随机序列不同。
内容的提问来源于stack exchange,提问作者ArceusLegend50
相关产品推荐
相关产品推荐

