How to Initialize a Multidimensional Char Array in C?

27,834

Solution 1

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 has no inbuilt string class, you have to make do with character arrays. You could alternatively use pointers to pointer to char.

Solution 2

The easiest way to do it is with char pointers as follows:

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

The element "10" in the first line is referenced as DirectionPosition[0][1] (zero-based, first index is line, second is column).

Solution 3

I recommend deciding the maximum length of strings and maximum number of strings per row and telling the compiler, e.g.:

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"},};

Now, DirectionPosition[2][1] &c will let you access specific strings in the matrix.

Solution 4

There's a slightly simpler way of doing this without all the extra brackets:

#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;
}
Share:
27,834
CodeConfused
Author by

CodeConfused

Updated on May 11, 2020

Comments

  • CodeConfused
    CodeConfused almost 4 years

    I'm trying to convert some code from C# to C so that it can be burnt onto a microcontroller.

    Could someone please tell me how I would convert a two dimensional string array in C# into something in C?

    My C# code looks like this:

    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"},};
    

    And moreover, how would I access the elements? In C# if I wanted the second element in the third row it would simply be DirectionPosition[2,1] but what is the equivalent of that when there is no string in C much less 2-D string arrays?

  • rampion
    rampion almost 15 years
    Note that since you're storing pointers to static strings that you won't be able to modify these strings in the code. If you want to modify them, use them as initializers for arrays as in dirkgently's code.
  • rampion
    rampion almost 15 years
    Yeesh. I far prefer the extra brackets for readability. The compiler may be able to easily figure out what entry goes where, but I'd like to be able to as well :)
  • CodeConfused
    CodeConfused almost 15 years
    Thank you Pax, I think this is probably the simplest way for me to do it given my lack of expertise in C. And you're absolutely right, it IS a static table that I do not need to change. So this solution seems to fit. Thanks to everyone else too for taking the time to help me out! Much appreciated :)