\0 当用循环初始化一个 char 数组时
\0 when initializing a char array with a loop
我需要用循环初始化一个字符数组并打印它。就这样:
int main( void )
{
char array[ 10 ];
for( int i = 1; i < 10; ++i ) {
array[ i - 1 ] = i;
}
// array[] contains numbers from 1 to 9 and an unitialized subscript
printf( "%s", array );
}
我想知道是否需要将 '[=11=]'
字符放入 array[ 9 ]
中,或者它是否已经存在。
换句话说:一旦我声明 char array[ 10 ];
最后一个下标是否包含 '\0' ?
我搜索了类似的问题,我能找到的更好的是,其中数组充满了一个循环,但直到最后,没有为终止字符留下space。
如实告诉我。
once I declared char array[ 10 ]; does the last subscript contains '[=10=]' ?
没有。它是未初始化的。它在每个元素中都有垃圾值,这些值来自最后使用同一块内存的任何代码。
In other words: once I declared char array[ 10 ]; does the last subscript contains '[=14=]' ?
没有
您定义了一个局部变量,但没有对其进行初始化。默认情况下,这些变量未初始化,但包含不确定的值。
如果要有定义值,需要初始化或赋值:
char array[ 10 ] = "";
这将定义一个包含 10 个元素的数组。
由于有初始化器,第一个元素将根据提供的字符串文字设置为 0
(=='[=12=]'
)。
此外,所有其他元素都将设置为 0
,因为您提供的初始化值少于数组中的元素。
不,您不需要在数组[9] 的末尾放置'\0'。
为什么?
因为当数组 (char,int,float) 未初始化时它包含垃圾值。
在初始化部分或全部之后,所有其他元素在 char 数组的情况下变为 0 或 \0。
示例:
字符数组[10];
所有元素都包含垃圾值。
初始化后
char array[10]={'a' ,'b'}; 所有其他元素自动变为 '\0'
对于结构也是如此。
once I declared char array[10];
does the last subscript contains '[=12=]'
?
答案是否定的:当你将数组定义为自动变量(函数中的局部变量)时,它是未初始化的。因此,可以假定其元素的 none 具有任何特定值。如果你初始化数组,即使是部分初始化,所有元素都将被初始化,或者显式地从初始化器中提供的值初始化,或者如果没有足够的初始化器则隐式地初始化到 0
。
0
和'[=12=]'
是等价的,都是int
表示0值的常量,习惯用'[=12=]'
表示末尾的空字节char
数组,使其成为 C 字符串。请注意 '0'
是不同的东西:它是 0
数字的字符代码。在 ASCII 中,'0'
的值为 48(或 0x30),但一些古代计算机过去使用不同的编码,其中 '0'
具有不同的值。 C 标准规定从 0
到 9
的所有 10 个数字的代码必须是连续的,因此数字 n
的代码为 '0' + n
.
请注意,代码中的循环将数组的 9 个元素的值设置为非零值,并使最后一个条目未初始化,因此数组不是空终止的,因此它不是 C 字符串。
如果要将 char
数组用作 C 字符串,则必须通过将 array[9]
设置为 '[=12=]'
来终止它。
另请注意,您可以通过在转换说明符中指定要输出的最大字节数作为 precision 字段来打印非空终止的 char
数组: %.9s
.
最后,请注意array[0] = 1;
并没有在array
的第一个位置设置一个有效字符,而是一个可能无法打印的控制代码。 array[0] = '0' + 1;
设置字符 '1'
.
#include <stdio.h>
int main(void) {
char array[10];
/* use the element number as the loop index: less error prone */
for (int i = 0; i < 9; ++i) {
array[i] = `0` + i + 1;
}
// array[] contains numbers from 1 to 9 and an unitialized subscript
printf("%.9s\n", array); // prints up to 9 bytes from `array`
array[9] = '[=10=]';
// array[] contains numbers from 1 to 9 and a null terminator, a valid C string
printf("%s\n", array); // produce the same output.
return 0;
}
我需要用循环初始化一个字符数组并打印它。就这样:
int main( void )
{
char array[ 10 ];
for( int i = 1; i < 10; ++i ) {
array[ i - 1 ] = i;
}
// array[] contains numbers from 1 to 9 and an unitialized subscript
printf( "%s", array );
}
我想知道是否需要将 '[=11=]'
字符放入 array[ 9 ]
中,或者它是否已经存在。
换句话说:一旦我声明 char array[ 10 ];
最后一个下标是否包含 '\0' ?
我搜索了类似的问题,我能找到的更好的是
如实告诉我。
once I declared char array[ 10 ]; does the last subscript contains '[=10=]' ?
没有。它是未初始化的。它在每个元素中都有垃圾值,这些值来自最后使用同一块内存的任何代码。
In other words: once I declared char array[ 10 ]; does the last subscript contains '[=14=]' ?
没有
您定义了一个局部变量,但没有对其进行初始化。默认情况下,这些变量未初始化,但包含不确定的值。 如果要有定义值,需要初始化或赋值:
char array[ 10 ] = "";
这将定义一个包含 10 个元素的数组。
由于有初始化器,第一个元素将根据提供的字符串文字设置为 0
(=='[=12=]'
)。
此外,所有其他元素都将设置为 0
,因为您提供的初始化值少于数组中的元素。
不,您不需要在数组[9] 的末尾放置'\0'。 为什么?
因为当数组 (char,int,float) 未初始化时它包含垃圾值。 在初始化部分或全部之后,所有其他元素在 char 数组的情况下变为 0 或 \0。
示例:
字符数组[10];
所有元素都包含垃圾值。
初始化后
char array[10]={'a' ,'b'}; 所有其他元素自动变为 '\0'
对于结构也是如此。
once I declared
char array[10];
does the last subscript contains'[=12=]'
?
答案是否定的:当你将数组定义为自动变量(函数中的局部变量)时,它是未初始化的。因此,可以假定其元素的 none 具有任何特定值。如果你初始化数组,即使是部分初始化,所有元素都将被初始化,或者显式地从初始化器中提供的值初始化,或者如果没有足够的初始化器则隐式地初始化到 0
。
0
和'[=12=]'
是等价的,都是int
表示0值的常量,习惯用'[=12=]'
表示末尾的空字节char
数组,使其成为 C 字符串。请注意 '0'
是不同的东西:它是 0
数字的字符代码。在 ASCII 中,'0'
的值为 48(或 0x30),但一些古代计算机过去使用不同的编码,其中 '0'
具有不同的值。 C 标准规定从 0
到 9
的所有 10 个数字的代码必须是连续的,因此数字 n
的代码为 '0' + n
.
请注意,代码中的循环将数组的 9 个元素的值设置为非零值,并使最后一个条目未初始化,因此数组不是空终止的,因此它不是 C 字符串。
如果要将 char
数组用作 C 字符串,则必须通过将 array[9]
设置为 '[=12=]'
来终止它。
另请注意,您可以通过在转换说明符中指定要输出的最大字节数作为 precision 字段来打印非空终止的 char
数组: %.9s
.
最后,请注意array[0] = 1;
并没有在array
的第一个位置设置一个有效字符,而是一个可能无法打印的控制代码。 array[0] = '0' + 1;
设置字符 '1'
.
#include <stdio.h>
int main(void) {
char array[10];
/* use the element number as the loop index: less error prone */
for (int i = 0; i < 9; ++i) {
array[i] = `0` + i + 1;
}
// array[] contains numbers from 1 to 9 and an unitialized subscript
printf("%.9s\n", array); // prints up to 9 bytes from `array`
array[9] = '[=10=]';
// array[] contains numbers from 1 to 9 and a null terminator, a valid C string
printf("%s\n", array); // produce the same output.
return 0;
}