2016-11-13 55 views
2

我必须将一个char数组初始化为0。我做到了像打印0初始化数组元素的值不会打印什么,为什么?

char array[256] = {0}; 

我想检查它是否工作,所以我尝试测试它

#include <stdio.h> 

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

后,我编译并运行它,在命令行中输出显示什么。

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

+6

你期望它打印什么? –

+0

它打印一个文字零,所以'printf'认为它完成了,因为它标记了一个字符串的末尾。 – usr2564301

+0

我的不好,搞错了:) @SouravGhosh –

回答

9

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

相关,从C11,章§7.21.6.1,(重点煤矿

c                如果没有l长度改性剂是目前,int参数被转换为一个 unsigned char,和结果字符被写入。

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

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

+1

谢谢。确实必须从'%c'改为'%d' –

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]); 

ASCII码(十进制/数字)值行字符的结束(\n)是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到所述阵列的所述第一元件和阵列的类型,您在制作(char[]int[]或任何)其中remainings 255字符填充有值0,不管。如果你写一对空括号{},所有的元素将是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

谢谢!我正在打印一个换行符,所以它使我疯狂......不知道为什么没有打印,而我期望0 –

+0

@TonyTannous编辑。 –

相关问题