如何在C语言中初始化多维字符数组?

4

我希望将一些C#代码转换为C语言,以便可以烧录到微控制器上。

请问有人能告诉我如何将C#中的二维字符串数组转换成C语言中的数据类型?

我的C#代码如下:

string[,] DirectionPosition = {{"00", "10", "", "01", ""},
                                        {"01", "11", "", "02", "00"},
                                        {"02", "12", "", "03", "01"},
                                        {"03", "13", "", "04", "02"},
                                        {"04", "14", "", "", "03"},
                                        {"10", "20", "00", "11", ""},
                                        {"11", "21", "01", "12", "10"},
                                        {"12", "22", "02", "13", "11"},
                                        .
                                        .
                                        .
                                        .
                                        {"44", "", "34", "", "43"},};

而且,我该如何访问这些元素呢? 在C#中,如果我想要第三行的第二个元素,只需要使用DirectionPosition[2,1],但是在没有字符串甚至没有二维字符串数组的C语言中,相应的等价方法是什么呢?

4个回答

10

用 char 指针是最简单的方法,如下所示:

char *DirectionPosition[9][5] = {
    {"00", "10", "",   "01", ""  },
    {"01", "11", "",   "02", "00"},
    {"02", "12", "",   "03", "01"},
    {"03", "13", "",   "04", "02"},
    {"04", "14", "",   "",   "03"},
    {"10", "20", "00", "11", ""  },
    {"11", "21", "01", "12", "10"},
    {"12", "22", "02", "13", "11"},
    {"44", "",   "34", "",   "43"}
};

第一行中的元素"10"被引用为DirectionPosition[0][1](从零开始计数,第一个索引是行,第二个是列)。


请注意,由于您正在存储指向静态字符串的指针,因此您将无法在代码中修改这些字符串。如果您想要修改它们,请像dirkgently的代码一样将它们用作数组的初始化器。 - rampion
我确实考虑过这个问题,@rampion,但考虑到微控制器方面和问题中的语气,我做出了将其视为常量表的决定。如果我错了,那么您应该使用其中一种非指针类型的3D解决方案。 - paxdiablo
谢谢Pax, 我认为这可能是我在C方面缺乏专业知识的情况下最简单的方法。而且你绝对是正确的,这确实是一个静态表格,我不需要更改它。所以这个解决方案似乎很合适。也感谢其他人抽出时间来帮助我!非常感激 :) - CodeConfused

7
char DirectionPosition[][ 5 ][ 3 ] = {{"00", "10", "", "01", ""},
                                    {"01", "11", "", "02", "00"},
                                    {"02", "12", "", "03", "01"},
                                    {"03", "13", "", "04", "02"},
                                    {"04", "14", "", "", "03"},
                                    {"10", "20", "00", "11", ""},
                                    {"11", "21", "01", "12", "10"},
                                    {"12", "22", "02", "13", "11"},
                                    .
                                    .
                                    .
                                    .
                                    {"44", "", "34", "", "43"},};

C语言没有内置的字符串类,你需要使用字符数组。你也可以使用指向字符指针的指针。


2
我建议确定字符串的最大长度和每行字符串的最大数量,并告诉编译器,例如:
typedef char string[3];
typedef string s5[5];

    s5 DirectionPosition[] = {{"00", "10", "", "01", ""}, {"01", "11", "", "02", "00"}, {"02", "12", "", "03", "01"}, {"03", "13", "", "04", "02"}, {"04", "14", "", "", "03"}, {"10", "20", "00", "11", ""}, {"11", "21", "01", "12", "10"}, {"12", "22", "02", "13", "11"}, {"44", "", "34", "", "43"},};

现在,DirectionPosition[2][1]等可以让您访问矩阵中特定的字符串。

1

有一种稍微简单的方法可以做到这一点,而不需要所有额外的括号:

#include <stdio.h>

int main(int argc, char **argv) {

char DirectionPosition[][ 5 ][ 3 ] = {"00", "10", "", "01", "",
                                    "01", "11", "", "02", "00",
                                    "02", "12", "", "03", "01",
                                    "03", "13", "", "04", "02",
                                    "04", "14", "", "", "03",
                                    "10", "20", "00", "11", "",
                                    "11", "21", "01", "12", "10",
                                    "12", "22", "02", "13", "11",
                                    "44", "", "34", "", "43"};

    printf("dp[1][1] == %s\n", DirectionPosition[1][1]);
    printf("dp[1][2] == %s\n", DirectionPosition[1][2]);
    printf("dp[1][3] == %s\n", DirectionPosition[1][3]);

    return;
}

哎呀,我更喜欢使用额外的括号来提高可读性。编译器可能能够轻松地弄清楚哪个条目应该放在哪里,但我也想能够理解 :) - rampion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接