【问题标题】:Printing the value of a 0-initialized array element prints nothing, why?打印初始化为 0 的数组元素的值不会打印任何内容,为什么?
【发布时间】:2017-03-27 07:52:16
【问题描述】:

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

char array[256] = {0};

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

#include <stdio.h>

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

编译运行后,命令行输出什么也没有。

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

【问题讨论】:

  • 你希望它打印什么?
  • 它打印一个字面值零,因此printf 认为它已经完成,因为这标志着一个字符串的结束。
  • 我的错,弄错了 :) @SouravGhosh
  • @RatulSharker 没问题。 :)
  • a 0 是整数,'0' 是字符。所以这一行:char s[256] = {0};'\0' (0x00) 填充数组,当你希望它用0x30 填充数组时建议使用:char s[256] = {'0'};

标签: c char printf format-specifiers


【解决方案1】:

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

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

c          如果不存在 l 长度修饰符,则 int 参数将转换为 unsigned char, 然后写入生成的字符。

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

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

【讨论】:

  • 谢谢。确实必须从 %c 更改为 %d
【解决方案2】:

您将s[10] 打印为字符(%c),s[10] 的数值为0,表示字符\0,表示字符串的结尾,没有文本表示。因此,您什么也看不到。

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

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

请注意,字符串的结尾与行尾不同,正如您的一个 cmets 中所说的那样。字符串结束意味着对字符序列的任何字符串操作必须在第一个\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,因此,以下 sn-p 将等效:

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[],@ 987654338@ 或其他)。如果你写了一对空的括号{},那么所有的元素都是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 时没有打印任何内容
  • @TonyTannous 已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2022-01-09
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多