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

如何在C语言中将一维char数组转为二维int数组并传递?

问题分析与解决方案

先帮你拆解代码里导致二维数组值错乱的核心问题,再给你修正后的完整代码,顺便解答你关于数组传递的疑问:

1. 二维数组维度完全搞反了

你在ft_test里定义的int stt[w][h];是错误的逻辑:

  • h是行数(高度),对应二维数组的第一维
  • w是列数(宽度),对应二维数组的第二维
    正确的定义应该是int stt[h][w];。原来的颠倒定义会导致数组访问越界,读取到内存里的随机垃圾值,这就是你看到部分值不符合预期的根本原因。

2. 处理换行符时未跳过后续判断

当遇到'\n'时,你只重置了j并增加了i,但代码会继续判断这个换行符是不是.或o(虽然不会匹配,但如果字符串末尾有换行,会导致i超出数组范围)。应该在处理完换行后加continue;,跳过当前循环的剩余步骤,同时别忘了移动计数器ct,避免死循环。

3. 变长数组未初始化

C语言中用变量作为维度定义的变长数组(VLA)不会自动初始化为0,未赋值的位置会是内存里的随机值。你需要先通过循环把整个数组初始化为0,确保这些垃圾值不会干扰结果。


修正后的完整代码

#include <stdio.h>
void ft_test(char *str,int w,int h)
{
    int ct = 0, ct2 = 0, i = 0, j = 0;
    // 修正维度:行是h,列是w
    int stt[h][w];
    
    // 初始化数组为0,避免垃圾值干扰
    for (int x = 0; x < h; x++) {
        for (int y = 0; y < w; y++) {
            stt[x][y] = 0;
        }
    }

    while(str[ct])
    {
        if (str[ct] == '\n')
        {
            j = 0;
            i++;
            ct++;
            continue; // 跳过后续判断,直接进入下一次循环
        }
        if (str[ct] == '.')
        {
            stt[i][j] = 1;
            j++;
        }
        else if (str[ct] == 'o')
        {
            stt[i][j] = 0;
            j++;
        }
        ct++;
    }

    // 打印数组,现在维度匹配,不会越界
    ct = 0;
    while (ct < h)
    {
        ct2 = 0;
        while (ct2 < w)
        {
            printf("%d",stt[ct][ct2]);
            ct2++;
        }
        printf("\n");
        ct++;
    }
}
int main()
{
    int w = 0, ct = 0, h = 0;
    char stt[] = ".o.o...o\n........\n...o..o.\n";
    // 计算宽度:直到第一个换行符
    while (stt[w] != '\n')
        w++;
    // 计算高度:统计换行符的数量
    while (stt[ct] != '\0')
    {
        if (stt[ct] == '\n')
            h++;
        printf("%c",stt[ct]);
        ct++;
    }
    printf("\n");
    ft_test(stt,w,h);
    return 0;
}

关于数组传递的补充解答

你问是否需要用malloc或指针传递整个数组:

  • 如果你的编译器支持C99及以上标准,变长数组可以直接作为参数传递,比如把函数签名改成void ft_test(char *str, int w, int h, int stt[h][w]),然后在main里定义数组传进去即可。
  • 如果需要更灵活的内存管理(比如数组规模很大,或者需要在函数内动态创建),可以用malloc动态分配二维数组:
// 动态分配二维数组
int **stt = malloc(h * sizeof(int *));
for (int i = 0; i < h; i++) {
    stt[i] = malloc(w * sizeof(int));
}
// 使用完毕后记得释放内存,避免泄漏
for (int i = 0; i < h; i++) {
    free(stt[i]);
}
free(stt);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:27:10