gpt4 book ai didi

使用数字作为大小创建整数 char 数组

转载 作者:太空狗 更新时间:2023-10-29 17:04:41 26 4
gpt4 key购买 nike

我试图在 C 中创建一个 char 数组,用 int 的数字填充它,但 int 可以是任意数量的数字。

我正在使用一个名为 getDigits(int num) 的创建函数,它返回 int 具有的数字数。

char buffer[getDigits(number)] = "";
snprintf(buffer, sizeof(buffer),"%d",number);

但是当我使用 gcc 编译时,它返回:

错误:可变大小对象可能未初始化

我已经尝试了一切。当我将它声明为 char fileSizeStr[5] = ""; 时,它起作用了。当我尝试动态声明缓冲区大小时,我可以看到问题越来越严重,但我真的很想知道这是否是一种实现此目的的方法。

最佳答案

这个问题正是你的编译器告诉你的;您不允许初始化 VLA。 Zack 在评论中给出了一个明显的解决方案:删除初始化。您会在此答案中找到工作示例,其中一些允许初始化,而另一些则不允许。您会在评论中找到更多相关信息。以下示例按照从最明智 (恕我直言) 到最不明智(涉及使用 malloc)为表示数字的十进制数字序列分配存储的顺序排列。


我建议使用相同的技巧来确定将 int 值存储为十进制数字需要多少字节,就像您将其用于八进制:除以 中的总位数int 乘以 3 并添加任何符号和 NUL 终止。 digit_count 可以像这样写成预处理器宏:

#include <limits.h>
#include <stddef.h>
#include <stdio.h>

#define digit_count(num) (1 /* sign */ \
+ sizeof (num) * CHAR_BIT / 3 /* digits */ \
+ (sizeof (num) * CHAR_BIT % 3 > 0)/* remaining digit */ \
+ 1) /* NUL terminator */

int main(void) {
short short_number = -32767;
int int_number = 32767;
char short_buffer[digit_count(short_number)] = { 0 }; /* initialisation permitted here */
char int_buffer[digit_count(int_number)];
sprintf(short_buffer, "%d", short_number);
sprintf(int_buffer, "%d", int_number);
}

如您所见,这里的一个强大好处是 digit_count 可用于任何类型的整数而无需修改:charshort , int, long, long long, 以及相应的unsigned类型。

相比之下,一个小缺点是您浪费了几个字节的存储空间,尤其是对于像 1 这样的小值。在许多情况下,此解决方案的简单性足以弥补这一点。在运行时计算小数位所需的代码将占用比此处浪费更多的内存空间。


如果您准备放弃上述代码的简单性和通用性,并且您真的想计算小数位数,Zacks 建议适用:删除初始化。这是一个例子:

#include <stddef.h>
#include <stdio.h>

size_t digit_count(int num) {
return snprintf(NULL, 0, "%d", num) + 1;
}

int main(void) {
int number = 32767;
char buffer[digit_count(number)]; /* Erroneous initialisation removed as per Zacks advice */
sprintf(buffer, "%d", number);
}

响应 malloc 建议:解决这个问题最不可怕的方法是避免不必要的代码(例如调用 malloc 和以后的 free )。如果您不必从函数返回对象,则不要使用 malloc!否则,请考虑存储到调用者提供的缓冲区(通过参数),以便调用者可以选择要使用的存储类型。这不是使用 malloc 的合适替代方案的情况非常罕见。

但是,如果您确实决定为此使用 mallocfree,请采用最不可怕的方式。避免对 malloc 的返回值进行类型转换和乘以 sizeof (char)(始终为 1)。下面的代码是一个例子。使用以上任一方法计算长度:

char *buffer = malloc(digit_count(number)); /* Initialisation of malloc bytes not possible */
sprintf(buffer, "%d", number);

...并且不要忘记 free(buffer); 完成后。

关于使用数字作为大小创建整数 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com