C 如果我声明一个字符数组,我是否也必须计算空字符?

C 如果我声明一个字符数组,我是否也必须计算空字符?,c,C,例如: char array[][5] = {"game", "house"}; house是否适合该数组,或者我是否必须添加空字符,因此我必须这样声明: char数组[][6]={“游戏”、“房子”}如果将数组用作字符串,它必须包含终止的空字符。终止空字符是数组的一部分,必须包含在其大小中 许多标准C库例程都采用字符串作为参数,字符串是以空字符结尾的字符数组 也可以出于自己的目的使用字符数组,而无需将其传递给需要字符串的标准库函数。如果这是使用数组的方式,则不需要包含终止空字符 当您使用字符

例如:

char array[][5] = {"game", "house"};
house
是否适合该数组,或者我是否必须添加空字符,因此我必须这样声明:


char数组[][6]={“游戏”、“房子”}

如果将数组用作字符串,它必须包含终止的空字符。终止空字符是数组的一部分,必须包含在其大小中

许多标准C库例程都采用字符串作为参数,字符串是以空字符结尾的字符数组

也可以出于自己的目的使用字符数组,而无需将其传递给需要字符串的标准库函数。如果这是使用数组的方式,则不需要包含终止空字符


当您使用字符串文字初始化这样的数组时,不需要在数组的大小中包含终止空字符的空间。字符串文字中的终止空字符将仅在有空间的情况下用于初始化数组元素。

这取决于您打算对字符串执行的操作

定义

char array[][5] = {"game", "house"};
将使用维度
2
5
初始化
array
<代码>数组[0]
将使用元素
'g'、'a'、'm'、'e'、'\0'
数组[1]
初始化为
'h'、'o'、'u'、's'、'e'
。注意
数组[1]
上没有终止的
'\0'

接下来会发生什么取决于代码随后对数组执行的操作。比如,

for (i = 0; i < 2; ++i)
{
   for (j = 0; j < 5, ++j)
   {
       if (array[i][j] != '\0')
           printf("%c", array[i][j]);
       else
           j = 5;    /*   terminate the inner loop */
   }       
   printf("\n");
}
将具有未定义的行为,因为
%s
格式将打印
数组[i]
的每个字符,直到找到终止的
'\0'
。由于
数组[1]
是初始化的,没有终止
'\0'
printf()
通常会运行到数组的末尾,即循环通过正好位于
数组的末尾的内存,并打印它找到的任何垃圾,直到它碰巧找到一个值为“\0”
的字符。如果程序可用的内存中没有此类字符,则程序可能只是继续打印垃圾字符,然后崩溃(例如,如果主机操作系统检测到程序访问内存,则不应该这样做,然后强制终止程序)

一般规则是:如果您使用的任何函数假定存在终止符
'\0'
printf()
,具有
%s
格式,
strcat()
strcmp()
等),则必须确保存在终止符。这意味着确保数组有足够的元素,并将其中一个元素初始化为
“\0”

如果您将
数组初始化为

char array[][6] = {"game", "house"};

然后
array[0]
array[1]
都有所需的终止符。

请注意:静默地吃字符串文本的结尾空字符只是C的一个特性。在C++中,禁止提供比要初始化的数组大的初始化字符串。

char array[][5] = {"game", "house"};
house
是否适合阵列

对。“house”适用于初始化数组
数组[1]
<代码>数组[1]
不是字符串,因为它缺少空字符<代码>数组[0]是一个字符串。
array[1]
array[0]
都是
char
的数组


试试
字符数组[][5]={“房子”,“游戏”}

打印“家庭游戏”

问题在于
打印(“%s”,数组[0])<代码>“%s”
需要指向字符串的匹配指针。这里,
数组[0]
不是字符串

要打印可能/可能不是字符串的字符数组,请使用精度。达到精度或遇到空字符时,打印将停止

char数组[][5]={“house”,“game”};
打印(“\n”,5,数组[0]);
打印(“\n”,5,数组[1]);
输出

<house>
<game>


@xing但如果我编译并打印它,它可以使用5列。@xing它可以打印“housegame”@xing为什么要打印“housegame”?如果你想在数组中存储一个N个字符的字符串,那么数组需要至少有N+1个元素宽才能容纳0终止符。是的,您可以将
{'h','o','u','s','e'}
放入一个5元素数组中,但这不是一个字符串,如果您将该数组作为参数传递给需要字符串的对象,您可能会得到意外的结果。@xing:一般来说,编译器不应该对
字符数组[][5]={“game”,“house”}发出警告。严格遵守C来初始化一个只适合显式字符的数组,并且没有终止空字符的空间。虽然这个注释是正确的,但它是多余的,因为问题被标记为C而不是C++。细节:“库例程采用的是指向字符串的指针”@ CHUX:7.1.1 1,字符串是描述数组的“由第一个字符终止并包括第一个字符的连续字符序列”(根据6.2.5.20,数组类型描述“具有特定成员对象类型的连续分配的非空对象集”)。因此,传递字符串就是传递数组,数组被转换为指向其第一个字符的指针。传递指向字符串的指针就是传递
char(*)[]
,这是错误的。第7条确实像您一样使用了“指向字符串的指针”,但它仍然不一致。我们可以说“指向字符串第一个字符的指针”
char array[][5] = { "house", "game"};
print("<%.*s>\n", 5, array[0]);
print("<%.*s>\n", 5, array[1]);
<house>
<game>