【问题标题】:\0 when initializing a char array with a loop\0 使用循环初始化 char 数组时
【发布时间】:2020-12-25 22:02:28
【问题描述】:

我需要用循环初始化一个字符数组并打印它。就这样:

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

我想知道是否需要将 '\0' 字符放入 array[ 9 ] 中,或者它是否已经存在。
换句话说:一旦我声明了 char array[ 10 ];,最后一个下标是否包含 '\0' ?

我搜索了类似的问题,我能找到的更好的是this,其中数组填充了一个循环,但直到最后,没有为终止字符留下空间。

请告诉我真相。

【问题讨论】:

  • 天哪,谢谢你的信息

标签: arrays c initialization


【解决方案1】:

一旦我声明了 char array[ 10 ];最后一个下标是否包含'\0'?

没有。它是未初始化的。它在每个元素中都有来自最后使用同一块内存的任何代码的垃圾值。

【讨论】:

  • 非常感谢您快速简洁的回答!
【解决方案2】:

换句话说:一旦我声明了 char array[ 10 ];最后一个下标是否包含'\0'?

没有。

您定义了一个局部变量,但没有对其进行初始化。这些变量默认情况下不会初始化,但会保存不确定的值。 如果你想有一个定义的值,你需要初始化或赋值:

char array[ 10 ] = "";

这将定义一个包含 10 个元素的数组。 由于存在初始化程序,由于提供的字符串文字,第一个元素将设置为 0 (=='\0')。 此外,所有其他元素都将设置为0,因为您提供的初始值设定项值少于数组中的元素。

【讨论】:

  • 如果我以这种方式初始化数组,最后一个下标包含 '\0' 还是只是 '0' ?
  • 正如我所写:0。 C 标准要求使用 0=='\0' 初始化剩余元素,而不是 48 == '0'
  • 好吧,我知道最后一个下标包含“零”,就像在 array[9] = 0; 中一样,现在 0 == '\0' 部分呢?它们是不同的东西,不是吗?
  • 不,它们是相同的 '\0' 是将值 0 表示为字符。您可以使用'\123' 来表示八进制值。
  • 你是对的!天哪,这是一个启示。我试图从 0 开始循环,它什么也不打印。但是我也尝试从 1 开始,它打印未知字符。是因为我尝试打印一个从 int 中获取值的 char 吗? (是的,我没有尝试就发布了这段代码,我只是想了解一般规则,我不需要那个特定的代码)。无论如何,非常感谢您的解释。
【解决方案3】:

不,你不需要把'\0'放在数组[9]的末尾。 为什么?

因为当数组 (char,int,float) 未初始化时,它包含垃圾值。 初始化部分或全部后,所有其他元素在 char 数组的情况下变为 0 或 \0。

示例: 字符数组[10];
所有元素都包含垃圾值。

初始化后

char array[10]={'a' ,'b'}; 所有其他元素自动变为 '\0'

在结构的情况下也是如此。

【讨论】:

  • 恐怕你没有回答 OP 的问题。
【解决方案4】:

一旦我声明了char array[10];,最后一个下标是否包含'\0'

答案是否定的:当您将数组定义为自动变量(函数中的局部变量)时,它是未初始化的。因此,不能假定它的任何元素都具有任何特定值。如果您初始化数组,即使是部分初始化,所有元素都将被初始化,或者显式地从初始化器中提供的值初始化,或者如果没有足够的初始化器,则隐式初始化到 0

0'\0' 是等价的,它们是代表值 0 的 int 常量。习惯上使用 '\0' 来表示 char 数组末尾的空字节,使其成为C 字符串。请注意,'0' 是另一回事:它是 0 数字的字符代码。在 ASCII 中,'0' 的值为 48(或 0x30),但一些古代计算机过去使用不同的编码,而 '0' 的值不同。 C 标准要求从09 的所有10 位数字的代码必须是连续的,因此数字n 的代码为'0' + n

请注意,您的代码中的循环将数组的 9 个元素的值设置为非零值,并使最后一个条目未初始化,因此数组不会以空值结尾,因此它不是 C 字符串。

如果要将char 数组用作C 字符串,则必须通过将array[9] 设置为'\0' 来终止它。

还请注意,您可以通过在转换说明符中将要输出的最大字节数指定为 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] = '\0';
    // 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;
}

【讨论】:

  • 哇,非常感谢你告诉我所有的真相
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2013-09-12
  • 2012-07-27
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多