像这样转换 int 时:
char a[256];
sprintf(a, "%d", 132);
确定a 应该有多大的最佳方法是什么?我假设手动设置它很好(正如我在任何地方看到的那样),但它应该有多大?在 32 位系统上可能的最大 int 值是多少,是否有一些棘手的方法可以即时确定它?
最佳答案
有些人认为这种方法有点矫枉过正,对于将整数转换为字符串,我可能更倾向于同意。但是当找不到字符串大小的合理界限时,我看到过这种方法,并且我自己也使用过。
int size = snprintf(NULL, 0, "%d", 132);
char * a = malloc(size + 1);
sprintf(a, "%d", 132);
我将分解这里发生的事情。
- 在第一行,我们要确定需要多少个字符。
snprintf
的前 2 个参数告诉它我想将结果的 0 个字符写入NULL
。当我们这样做时,snprintf
实际上不会在任何地方写入任何字符,它只会返回已写入的字符数。这就是我们想要的。 - 在第二行,我们将内存动态分配给一个
char
指针。确保并将 1 添加到所需的大小(对于尾随\0
终止字符)。 - 现在有足够的内存分配给
char
指针,我们可以安全地使用sprintf
将整数写入char
指针。
当然,如果你愿意,你可以让它更简洁。
char * a = malloc(snprintf(NULL, 0, "%d", 132) + 1);
sprintf(a, "%d", 132);
除非这是一个“又快又脏”的程序,否则您总是希望确保释放使用 malloc
调用的内存。这就是 C 的动态方法变得复杂的地方。但是,恕我直言,如果您不想分配巨大的 char
指针,而大多数时候您只会使用其中的一小部分, 那么我认为这不是一个坏方法。
关于c - 确定 sprintf 缓冲区大小 - 标准是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919995/