C 如何创建二维字符数组? [重复]

问题描述 投票:0回答:3

因此想创建一个二维字符数组用于测试目的。这是我的代码。

    const int rows = 4;
    const int columns = 6;
    //char field[rows][columns];
    //fill_field(rows,columns,field);
    char field[rows][columns] = {
                            "A BCD ",
                            "B CDA ", 
                            "C DAB ", 
                            "D ABC "
                            };

对于我输入的每个字符串,我收到错误消息“可变大小的对象可能未初始化”和“数组初始值设定项中的多余元素”。

c multidimensional-array initialization c-strings variable-length-array
3个回答
1
投票

对于初学者来说,如果您希望数组包含字符串,那么

columns
必须设置为
7
。否则,用作初始值设定项的字符串的终止零字符
'\0'
将不会存储在数组中。因此,数组将不包含字符串。

本声明

const int rows = 4;
const int columns = 6;
//char field[rows][columns];
//fill_field(rows,columns,field);
char field[rows][columns] = {
                        "A BCD ",
                        "B CDA ", 
                        "C DAB ", 
                        "D ABC "
                        };

声明一个变长数组,因为变量

rows
columns
不是 C 标准中的整型常量表达式。来自 C 标准(6.6 常量表达式)

6 整数常量表达式117) 应具有整数类型并且应 仅具有整数常量、枚举常量的操作数, 字符常量、结果为整数的 sizeof 表达式 常量和作为立即操作数的浮点常量 演员表。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数。

和(6.7.6.2 数组声明符)

4 如果不存在大小,则数组类型是不完整类型。如果 大小是 * 而不是表达式,数组类型是 a 未指定大小的变长数组类型,只能使用 在具有函数原型范围的声明或类型名称中;这样的 数组仍然是完整的类型。 如果大小是整数 常量表达式和元素类型具有已知的常量大小, 数组类型不是变长数组类型;否则, 数组类型是变长数组类型。 (可变长度数组 是实现不需要支持的条件功能;看 6.10.8.3.)

此类数组可能不会在其声明中初始化。来自 C 标准(6.7.9 初始化)

3 要初始化的实体的类型应为数组 未知大小或完整的对象类型不是可变长度 数组类型.

您可以这样写

enum { rows = 4, columns = 7 };
//char field[rows][columns];
//fill_field(rows,columns,field);
char field[rows][columns] = {
                        "A BCD ",
                        "B CDA ", 
                        "C DAB ", 
                        "D ABC "
                        };

请注意,您可以声明一个指向字符串文字的指针数组,而不是二维数组,例如

const char * field[] = { "A BCD ", "B CDA ", "C DAB ", "D ABC " };

const size_t N = sizeof( field ) / sizeof( *field );

前提是您不打算更换琴弦。

要访问字符串文字的字符,您可以使用具有与二维数组类似的下标运算符的表达式,例如

for ( size_t i = 0; i < N; i++ )
{
    for ( size_t j = 0; field[i][j] != '\0'; j++ )
    {
        putchar( field[i][j] );
    }
    putchar( '\n' );
}

0
投票

如果大小不是 常量表达式,数组将变为可变长度数组 (VLA),并且此类对象无法初始化。

const int
不是常量表达式。

您需要将变量定义更改为宏

#define rows 4
#define columns 6

https://godbolt.org/z/sYT8K8rva


-1
投票

出现错误的原因是 siz 字符串的长度为 7 个字符,因为编译器会在任何字符串的末尾添加另一个包含零值的字符。这使得数组存储需要 7 个字符而不是 6 个。

四种有效方法。选择您喜欢的语法...我刚刚编译了它们。

int main()
    {
        char field[4][6] = {
                               {'A',' ','B','C','D',' '},
                               {'B',' ','C','D','A',' '},
                               {'C',' ','D','A','B',' '},
                               {'D',' ','A','B','C',' '},
        };
    
        char fieldWithNulls[4][7] = {
                               {'A',' ','B','C','D',' ', 0},
                               {'B',' ','C','D','A',' ', 0},
                               {'C',' ','D','A','B',' ', 0},
                               {'D',' ','A','B','C',' ', 0},
        };

        char fieldWithNullsAndStrings[][7] = {
                          {"A BCD "},
                          {"B CDA "},
                          {"C DAB "},
                          {"D ABC "},
        };

       char fieldWithNullsAndStrings2[][7] = {
                      "A BCD ",
                      "B CDA ",
                      "C DAB ",
                      "D ABC ",
       };
    }

显然你可以按照你想要的方式调整这些。 这个问题并没有真正说明所有的要求是什么,只是他所做的不起作用。

您还可以删除第一个数组大小,因为编译器可以根据给定的列大小计算出它,例如:

char fieldWithNulls[][7] = {

最后三个数组包含一个零终止符,因此可以视为 c 字符串。编译后,它们在内存中也是相同的。选择您喜欢的语法。

© www.soinside.com 2019 - 2024. All rights reserved.