C语言二维字符数组存储字符串的赋值错误与乱码问题解决
C语言问答游戏:二维字符数组赋值问题与随机选题实现
问题原因分析
初始代码编译错误
er[0][]="2+2"; 这种写法违反C语言语法,数组下标不能留空,编译器无法识别目标操作位置,直接抛出expected expression before ']' token错误。
修改后代码的警告与运行问题
er[0][13]="2+2"; 存在两个致命问题:
er[0][13]是单个字符(数组下标从0开始,char er[10][13]每行仅包含0-12共13个有效位置),此处属于越界访问;- 将字符串常量(本质是指针)赋值给单个字符变量,类型完全不匹配,因此触发
assignment makes integer from pointer without a cast警告,且题目字符串根本没存入数组,运行时自然输出乱码或空白。
正确解决方法
方法1:数组定义时直接初始化(最简便)
C语言允许在定义二维字符数组时直接批量赋值字符串,这是合法且高效的写法:
#include <stdio.h> #include <stdlib.h> #include <time.h> void qna(){ int i; // 定义时直接初始化,确保第二维长度足够容纳最长题目(含结束符'\0') char er[10][20] = { "2+2", // 答案:4 "4-5", // 答案:-1 "10*10", // 答案:100 "17*3", // 答案:51 "9/3", // 答案:3 "45+24+35-68", // 答案:36 "4-2", // 答案:2 "592-591", // 答案:1 "8+3", // 答案:11 "9*9" // 答案:81 }; // 测试输出所有题目 for(i = 0; i < 10; i++){ printf("%s\n", er[i]); } } int main() { qna(); return 0; }
方法2:定义后用strcpy赋值(适合动态修改场景)
如果需要在程序运行中动态赋值,必须使用字符串复制函数strcpy,记得包含<string.h>头文件:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // 必须包含该头文件 void qna(){ int i; char er[10][20]; // 预留足够长度 strcpy(er[0], "2+2"); strcpy(er[1], "4-5"); strcpy(er[2], "10*10"); strcpy(er[3], "17*3"); strcpy(er[4], "9/3"); strcpy(er[5], "45+24+35-68"); strcpy(er[6], "4-2"); strcpy(er[7], "592-591"); strcpy(er[8], "8+3"); strcpy(er[9], "9*9"); for(i = 0; i < 10; i++){ printf("%s\n", er[i]); } } int main() { qna(); return 0; }
实现随机选取5道不重复题目
结合你的需求,补充随机选5道题的代码(用洗牌算法确保无重复):
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> void qna(){ int i, j; char er[10][20] = { "2+2", "4-5", "10*10", "17*3", "9/3", "45+24+35-68", "4-2", "592-591", "8+3", "9*9" }; int indices[10]; // 存储题目下标 // 初始化下标数组 for(i = 0; i < 10; i++){ indices[i] = i; } // 洗牌算法:随机交换下标 srand((unsigned int)time(NULL)); for(i = 9; i > 0; i--){ j = rand() % (i + 1); int temp = indices[i]; indices[i] = indices[j]; indices[j] = temp; } // 输出前5道随机题目 printf("随机抽取的5道题目:\n"); for(i = 0; i < 5; i++){ printf("%d. %s\n", i+1, er[indices[i]]); } } int main() { qna(); return 0; }
注意事项
- 定义二维字符数组时,第二维长度必须大于最长字符串长度+1(C字符串末尾有隐藏的
'\0'结束符),比如最长题目"45+24+35-68"共11个字符,第二维至少设为12,此处设为20留足余量; - 使用
rand()前必须用srand((unsigned int)time(NULL))初始化随机数种子,确保每次运行得到不同的随机序列。
内容的提问来源于stack exchange,提问作者ArceusLegend50
相关产品推荐
相关产品推荐

