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

ana*_*nac 7 c arrays printf digits itoa

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

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

char buffer[getDigits(number)] = "";
snprintf(buffer, sizeof(buffer),"%d",number);
Run Code Online (Sandbox Code Playgroud)

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

error: variable-sized object may not be initialized

我已经尝试了一切.当我宣布它时char fileSizeStr[5] = "";,它是有效的.当我尝试动态声明缓冲区大小时,我可以看到问题正在上升,但我真的想知道是否是实现此目的的一种方法.

aut*_*tic 16

问题正如您的编译器告诉您的那样; 您不能初始化VLA.Zack在评论中给出了明显的解决方案:删除初始化.你会在这个答案中找到工作的例子,其中一些确实允许初始化,而另一些则不允许.您可以在评论中找到有关该信息的更多信息.以下示例从最敏感(IMHO)到最不敏感(涉及使用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);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在这里一个强大的好处是,digit_count可以用于任何类型的整数无修改:char,short,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);
}
Run Code Online (Sandbox Code Playgroud)

响应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);
Run Code Online (Sandbox Code Playgroud)

...... free(buffer);当你完成它的时候别忘了.


小智 5

尝试类似的东西:

 char* buffer =(char *)malloc(getDigits(number)*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

malloc和calloc用于dinamic分配.

  • 1.不要施放malloc.2.没有必要乘以`sizeof(char)`因为`sizeof(char)`在*中总是*1*. (4认同)