打印0初始化数组元素的值什么都不打印,为什么?

时间:2016-11-13 16:01:46

标签: c char printf format-specifiers

我必须将char数组初始化为0。我这样做了

char array[256] = {0};

我想检查它是否有效,所以我尝试了它

#include <stdio.h>

int main()
{
    char s[256] = {0};
    printf("%c\n", s[10]);
    return 0;
}

编译并运行后,命令行输出什么都没有显示。

我错过了什么?也许我以错误的方式初始化了数组?

2 个答案:

答案 0 :(得分:9)

TL; DR - %c是字符表示。使用%d查看小数0值。

相关,来自C11,章节§7.21.6.1,(强调我的

  

c如果不存在l长度修饰符,则int参数将转换为   unsigned char会写出结果字符。

仅供参考,请参阅printable值列表。

也就是说,对于托管环境,int main()应为int main(void),至少要符合标准。

答案 1 :(得分:5)

您正在将s[10]打印为字符(%c),s[10]的数值为0,表示字符\0,其中表示字符串结尾,没有文字表示。因此你没有看到任何东西。

如果要查看数值而不是字符值,请使用%d将其打印为十进制(整数)数字:

printf("%d\n", s[10]);

请注意,字符串的结尾与行尾不同,如您的一条评论中所述。字符串结尾表示当第一个\0到达时,字符序列上的任何字符串操作都必须停止。如果字符序列在\0之后还有其他内容,则不会打印它,因为字符串操作会在第一个\0字符上停止。

然而,行尾是普通字符,其视觉效果是指终端或文本编辑器在新行的行尾之后打印下一个字符。

如果你想要一个满载行尾字符的向量(并将其打印出来),你必须移动向量并填充它:

char s[256];
int i;

for (i = 0; i < 256; ++i)
     s[i] = '\n';

printf("%c\n", s[10]);

行尾字符(\n)的ASCII(十进制/数字)值为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填充,无论你在哪种类型的数组({ {1}},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

我希望通过所有这些例子,你可以全面了解。