【问题标题】:How to Initialize a Multidimensional Char Array in C?如何在 C 中初始化多维字符数组?
【发布时间】:2010-10-25 02:39:22
【问题描述】:

我正在尝试将一些代码从 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 中没有字符串更不用说二维字符串数组时,它的等价物是什么?

【问题讨论】:

    标签: c# c arrays multidimensional-array


    【解决方案1】:

    最简单的方法是使用 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,但考虑到微控制器方面和问题的语气,我做出了将其视为常量表的命令决定。我可能错了,在这种情况下您应该使用 3d 非指针类型的解决方案之一。
    • 谢谢 Pax,鉴于我缺乏 C 方面的专业知识,我认为这可能是我最简单的方法。你说得对,它是我不需要的静态表改变。所以这个解决方案似乎很合适。也感谢其他人花时间帮助我!非常感谢:)
    【解决方案2】:
    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 没有内置的字符串类,您必须使用字符数组。您也可以使用指向 char 的指针。

    【讨论】:

      【解决方案3】:

      我建议确定字符串的最大长度和每行的最大字符串数并告诉编译器,例如:

      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] &c 将允许您访问矩阵中的特定字符串。

      【讨论】:

        【解决方案4】:

        有一种更简单的方法可以不用所有额外的括号:

        #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;
        }
        

        【讨论】:

        • 是的。为了便于阅读,我更喜欢额外的括号。编译器可能能够很容易地弄清楚哪些条目在哪里,但我也希望能够:)
        猜你喜欢
        • 2012-09-27
        • 1970-01-01
        • 2015-07-25
        • 2011-01-05
        • 1970-01-01
        • 2011-04-03
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多