访问三维字符数组

时间:2016-11-14 08:25:45

标签: c multidimensional-array

char t[] = {'a','b','$'};
char nt[] = {'S','A'};
char table[2][3][2] = { {"AA","AA",""}, {"aA","b",""} };

void main(){

    printf("%s",table[0][0]);
}

输出:

  

AAAA

输出应为AA,有人可以帮我解决,无法弄清楚问题。

2 个答案:

答案 0 :(得分:1)

您的数组没有空终止符的空间。 table的最右侧维度必须至少为3才能将元素用作C字符串。您现在正在访问数组的越界(使用%s中的printf()打印时)undefined behaviour

char table[2][3][3] = ...

如果要使用更长的字符串文字,请同样调整长度。

顺便说一下,void main()不是main()的标准签名。使用int main(void)或类似内容。

答案 1 :(得分:0)

实际上,您对数组表的声明等同于以下声明

char table[2][3][2] = { { { 'A', 'A' }, , { 'A', 'A' },, { '\0', '\0' } },
                        { { 'A', 'A' }, { 'b', '\0' }, { '\0', '\0' } } };

你可以看到不是子数组的所有元素table [i] [j]其中i和j一些索引包含字符串。因此,要输出此类子数组的元素,您应该准确指定要输出的字符数。您可以通过以下方式执行此操作

printf( "%*.*s\n", 2, 2, table[0][0] );

这是一个更完整的例子

char table[2][3][2] = { {"AA","AA",""}, {"aA","b",""} };

for ( size_t i = 0; i < 2; i++ )
{
    for ( size_t j = 0; j < 3; j++ )  printf( "%*.*s ", 2, 2, table[i][j] );
    printf( "\n" );
}

程序输出

4
AA AA    
aA  b 

然而,如果数组包含的字符串是终止零的空间会更好。

例如,当字符串文字初始化数组时,如果终止零没有空间,则C ++不允许这样定义字符数组。编译器将发出一个数组。

从而以下列方式声明数组

char table[2][3][3] = { {"AA","AA",""}, {"aA","b",""} };
              ^^^^^

考虑到无参数的函数main应在C中定义,如

int main( void )