尽管按字面意思输入了我想要的整数大小,但 Char 字符串长度未正确初始化?

Char string length not getting initialized properly despite literally putting in the integer size I want it to be?

我正在使用 C 中的 char 数组。我在上一步中设置了大小。当我打印出来时,它清楚地将 num_digits 显示为 1。 但是当我把它设置为一个 char 数组的大小以使其成为一个大小为 num_digits 的 char 数组时,它会将数组的大小设置为 6。 在下一步中,当我打印 strlen(number_array) 时,它会打印 6。打印出来时我得到了一些带有很多问号的东西。有谁知道为什么会这样?

int num_digits = get_num_digits(number);
printf("Num digits are %d\n", num_digits);
char number_array[num_digits];
printf("String len of array: %d\n", strlen(number_array));

您需要以 null 终止数组。

char number_array[num_digits + 1];
number_array[num_digits] = '[=10=]';

没有这个空终止符,C 无法知道您何时到达数组的末尾。

只需使用 'sizeof' 而不是 'strlen'

printf("String len of array: %d\n", sizeof(number_array));

我在这里看到了几个可能的问题:

  • 中所述,C 字符数组(通常称为字符串)需要空终止符。您可以使用以下内容明确设置它:

    number_array[number + 1] = '[=11=]'; /* See below for why number + 1 */

将整个字符数组预初始化为空值,而不是仅仅将最后一个元素设置为空值可能会有所帮助。一些编译器可能会为你做这件事,但如果没有,你需要用类似的东西明确地做这件事:

for (int i = 0; i < num_digits + 1; i ++) number_array[i] = '[=10=]';

请注意,对于 gcc,我必须使用 C99 模式使用 -std=c99 来编译它,因为编译器不喜欢 for 语句中的初始化。

  • 此外,所提供的代码将字符数组的长度设置为与 number 的长度相同。我们不知道 get_num_digits returns 是什么,但是如果它 returns 是一个整数中有效数字的实际位数,这将是一个短的(见上文和其他答案),如您需要一个额外的字符作为空终止符。一个例子:如果数字是 123456 和 get_number_digits returns 6,你需要将 number_array 的长度设置为 7,而不是 6(即 number + 1)。

char number_array[num_digits]; 为字符串分配一些 space。它是 num_digits 个字符的数组。 C 中的字符串表示为字符数组,末尾有一个空字节。 (空字节的值为零,不要与数字字符 '0' 混淆。)所以这个数组可以容纳最多 num_digits - 1 个字符的字符串。

sizeof(number_array) 给出数组存储大小。这是一个字符串加上它的空终止符的 space 的总数。在任何给定时间,该数组可以包含任意长度的字符串,最大为 number_array - 1,或者如果数组不包含空终止符,则它可能根本不包含字符串。

strlen(number_array) 给出数组中包含的字符串的长度。如果数组不包含空终止符,此调用可能 return 一个垃圾值或使您的程序崩溃(或者让恶魔从您的鼻子里飞出来,但幸运的是大多数计算机缺少必要的硬件)。

因为你还没有初始化number_array,它包含之前发生在内存中的任何东西。根据您的系统的工作方式,这可能会或可能不会因程序的一次执行而有所不同,并且这肯定会有所不同,具体取决于程序一直在做什么以及编译器和操作系统。

您需要做的是:

  • 为数组留出足够的空间来放置空终止符。
  • 通过将第一个字符设置为零来将数组初始化为空字符串。
  • 可选,将整个数组初始化为零。这不是必需的,但它可以简化数组的进一步工作。
  • 使用 %zu 而不是 %d 打印尺寸。 %d 用于 int,但 sizeofstrlen return 用于 size_t,这取决于您的系统可能相同也可能不同整数的大小。
char number_array[num_digits + 1];
number_array[0] = 0;  // or memset(number_array, 0, sizeof(number_array));
printf("Storage size of array: %zu\n", sizeof(number_array));
printf("The array contains an empty string: length=%zu\n", strlen(number_array));