因此想创建一个二维字符数组用于测试目的。这是我的代码。
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 "
};
对于我输入的每个字符串,我收到错误消息“可变大小的对象可能未初始化”和“数组初始值设定项中的多余元素”。
对于初学者来说,如果您希望数组包含字符串,那么
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' );
}
如果大小不是 常量表达式,数组将变为可变长度数组 (VLA),并且此类对象无法初始化。
const int
不是常量表达式。
您需要将变量定义更改为宏
#define rows 4
#define columns 6
出现错误的原因是 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 字符串。编译后,它们在内存中也是相同的。选择您喜欢的语法。