C语言中的三维字符数组

4
    char monsternivel1[][3][4] = {
    {"Rat","Bat","Spider"},
    {"Goblin","Orc","Drawf"},
    {"Dragon","Lich","Banshee"},
    {"Demon","Hydra","Giant Spider"}
    };

它说:
> E:\Dungeon Crawler.c||In function 'rndMonster':| E:\Dungeon
> Crawler.c|10|warning: initializer-string for array of chars is too
> long [enabled by default]| E:\Dungeon Crawler.c|10|warning: (near
> initialization for 'monsternivel1[0][2]') [enabled by default]|
> E:\Dungeon Crawler.c|11|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|11|warning:
> (near initialization for 'monsternivel1[1][0]') [enabled by default]|
> E:\Dungeon Crawler.c|11|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|11|warning:
> (near initialization for 'monsternivel1[1][2]') [enabled by default]|
> E:\Dungeon Crawler.c|12|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|12|warning:
> (near initialization for 'monsternivel1[2][0]') [enabled by default]|
> E:\Dungeon Crawler.c|12|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|12|warning:
> (near initialization for 'monsternivel1[2][2]') [enabled by default]|
> E:\Dungeon Crawler.c|13|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|13|warning:
> (near initialization for 'monsternivel1[3][0]') [enabled by default]|
> E:\Dungeon Crawler.c|13|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|13|warning:
> (near initialization for 'monsternivel1[3][1]') [enabled by default]|
> E:\Dungeon Crawler.c|13|warning: initializer-string for array of chars
> is too long [enabled by default]| E:\Dungeon Crawler.c|13|warning:
> (near initialization for 'monsternivel1[3][2]') [enabled by default]|

我不理解字符型的三维数组,你有什么想法吗? 第一个[]应该是变量,第二个[]应该是字符串数量,第三个[]应该是类别?

3个回答

6
你可能想要做的是:

const char *monsternivel1[4][3] = {
    {"Rat","Bat","Spider"},
    {"Goblin","Orc","Drawf"},
    {"Dragon","Lich","Banshee"},
    {"Demon","Hydra","Giant Spider"}
  };

这仍然是一个char*的二维数组。请注意,二维数组的顺序是 [行][列] 而不是 [列][行]


那么我不需要三维数组吗? - Lucas Bertollo
1
@LucasBertollo 是的,在这种情况下,2个维度绝对足够了。我认为增加更多维度只会使它变得更复杂,难以维护。如果你将char*作为数组的类型,一个“条目”已经是一个以空字符结尾的字符串 - 所以维度实际上只是为了字符串本身(不需要为每个字符设置维度)。 - Constantin
哦,谢谢。还有一个问题,const 和变量名前的 * 是什么意思? - Lucas Bertollo
@Constantin,char *和char[]之间有区别,你没有提到,这可能会出现严重问题。因为没有解释这里的权衡,所以我给你打-1分。 - zubergu
像我说的那样,这取决于观点。通常,“高维数组”即使在第二维中也是用指针构建的。尽管内存布局不等同于真正的3D数组,但生成的数据结构仍然通常称为数组。 - Arkku
显示剩余3条评论

3
如果需要一个3D数组,那么最后一维必须足够大以容纳每个字符串:
char monsternivel1[][3][13] = {
    { "Rat", "Bat", "Spider" },
    { "Goblin", "Orc", "Dwarf" },
    { "Dragon", "Lich", "Banshee" },
    { "Demon", "Hydra", "Giant Spider" },
};

注意:'drawf'应为'dwarf'。

1
正如错误信息所述,您尝试初始化的数组长度不足以容纳这些字符串的所有字符。
例如,“Giant Spider”需要13个字符,包括终止空字符'\0'。
请尝试以下操作:
char monsternivel1[4][3][13] = {
    {"Rat","Bat","Spider"},
    {"Goblin","Orc","Drawf"},
    {"Dragon","Lich","Banshee"},
    {"Demon","Hydra","Giant Spider"}
 };

这个问题可以用指针的方式来思考。不确定你是否熟悉指针,但在C语言中,字符数组被实现为指向数组中第一个字符的指针。
因此,数组的第一个索引指定了指向字符指针数组的指针数。
第二个索引指定了每个指针数组中的字符数组指针数。
最后,第三个索引指定了包含数据的最终数组中字符(长度)的最大数量。
无论你想要一个2D指针数组还是一个3D字符数组取决于你计划在程序的其他地方如何处理数据。

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