打印 0 初始化的数组元素的值什么也打印不出,为什么?
Printing the value of a 0-initialized array element prints nothing, why?
我必须将一个字符数组初始化为 0。我喜欢
char array[256] = {0};
我想检查它是否有效,所以我尝试对其进行测试
#include <stdio.h>
int main()
{
char s[256] = {0};
printf("%c\n", s[10]);
return 0;
}
编译后运行,命令行输出什么也没有。
我错过了什么?也许我以错误的方式初始化了数组?
TL;DR -- %c
是字符表示。使用 %d
查看十进制 0
值。
相关,来自 C11
,章节 §7.21.6.1,(强调我的)
c
If no l
length modifier is present, the int
argument is converted to an
unsigned char
, and the resulting character is written.
仅供参考,请参阅 printable 值列表。
也就是说,对于托管环境,int main()
应该是int main(void)
,至少要符合标准。
你打印的s[10]
是一个字符(%c
),s[10]
的数值是0
,代表字符[=20=]
, 这意味着字符串结束并且没有文本表示。因此,您什么也看不到。
如果要查看数值而不是字符值,请使用%d
将其打印为十进制(整数)数:
printf("%d\n", s[10]);
请注意,如您的评论之一所述,字符串结尾与行结尾不同。字符串结束意味着对字符序列的任何字符串操作必须在第一个 [=20=]
到达时停止。如果字符序列在 [=20=]
之后还有其他任何内容,则不会打印它,因为字符串操作在第一个 [=20=]
字符处停止。
然而,行尾是一个普通字符,其视觉效果是说终端或文本编辑器在新行中打印行尾后的下一个字符。
如果你想要一个充满行尾字符的向量(并打印它们),你必须移动向量并填充它:
char s[256];
int i;
for (i = 0; i < 256; ++i)
s[i] = '\n';
printf("%c\n", s[10]);
行尾字符 (\n
) 的 ASCII (decimal/numerical) 值为 12,因此,以下代码段将等效:
char s[256];
int i;
for (i = 0; i < 256; ++i)
s[i] = 12;
printf("%c\n", s[10]);
但这不起作用(它不打印新行):
char s[256] = {'\n'}; // or {12};
printf("%c\n", s[10]);
因为{'\n'}
的作用是把\n
赋值给数组的第一个元素,剩下的255个字符用0值填充,不管你做的是什么类型的数组(char[]
、int[]
或其他)。如果你写一对空的括号{}
,所有的元素都会是0。
所以,这两个语句是等价的:
char s[256] = {}; // Implicit filling to 0.
char s[256] = {0}; // Implicit filling to 0 from the second element.
但是,没有定义数组:
char s[256];
数组未填充(未初始化),因此,s
的每个元素将包含任何内容,直到您用值填充它,例如,用 for
.
我希望通过所有这些示例,您可以了解全部情况。
我必须将一个字符数组初始化为 0。我喜欢
char array[256] = {0};
我想检查它是否有效,所以我尝试对其进行测试
#include <stdio.h>
int main()
{
char s[256] = {0};
printf("%c\n", s[10]);
return 0;
}
编译后运行,命令行输出什么也没有。
我错过了什么?也许我以错误的方式初始化了数组?
TL;DR -- %c
是字符表示。使用 %d
查看十进制 0
值。
相关,来自 C11
,章节 §7.21.6.1,(强调我的)
c
If nol
length modifier is present, theint
argument is converted to anunsigned char
, and the resulting character is written.
仅供参考,请参阅 printable 值列表。
也就是说,对于托管环境,int main()
应该是int main(void)
,至少要符合标准。
你打印的s[10]
是一个字符(%c
),s[10]
的数值是0
,代表字符[=20=]
, 这意味着字符串结束并且没有文本表示。因此,您什么也看不到。
如果要查看数值而不是字符值,请使用%d
将其打印为十进制(整数)数:
printf("%d\n", s[10]);
请注意,如您的评论之一所述,字符串结尾与行结尾不同。字符串结束意味着对字符序列的任何字符串操作必须在第一个 [=20=]
到达时停止。如果字符序列在 [=20=]
之后还有其他任何内容,则不会打印它,因为字符串操作在第一个 [=20=]
字符处停止。
然而,行尾是一个普通字符,其视觉效果是说终端或文本编辑器在新行中打印行尾后的下一个字符。
如果你想要一个充满行尾字符的向量(并打印它们),你必须移动向量并填充它:
char s[256];
int i;
for (i = 0; i < 256; ++i)
s[i] = '\n';
printf("%c\n", s[10]);
行尾字符 (\n
) 的 ASCII (decimal/numerical) 值为 12,因此,以下代码段将等效:
char s[256];
int i;
for (i = 0; i < 256; ++i)
s[i] = 12;
printf("%c\n", s[10]);
但这不起作用(它不打印新行):
char s[256] = {'\n'}; // or {12};
printf("%c\n", s[10]);
因为{'\n'}
的作用是把\n
赋值给数组的第一个元素,剩下的255个字符用0值填充,不管你做的是什么类型的数组(char[]
、int[]
或其他)。如果你写一对空的括号{}
,所有的元素都会是0。
所以,这两个语句是等价的:
char s[256] = {}; // Implicit filling to 0.
char s[256] = {0}; // Implicit filling to 0 from the second element.
但是,没有定义数组:
char s[256];
数组未填充(未初始化),因此,s
的每个元素将包含任何内容,直到您用值填充它,例如,用 for
.
我希望通过所有这些示例,您可以了解全部情况。