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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:35:41