c - 确定 sprintf 缓冲区大小 - 标准是什么?

标签 c int printf

像这样转换 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);

我将分解这里发生的事情。

  1. 在第一行,我们要确定需要多少个字符。 snprintf 的前 2 个参数告诉它我想将结果的 0 个字符写入 NULL。当我们这样做时,snprintf 实际上不会在任何地方写入任何字符,它只会返回已写入的字符数。这就是我们想要的。
  2. 在第二行,我们将内存动态分配给一个char 指针。确保并将 1 添加到所需的大小(对于尾随 \0 终止字符)。
  3. 现在有足够的内存分配给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/

相关文章:

python - 为什么Python的列表结构使用**ob_item而不是*ob_item存储PyObject

java - 将 String 数组转换为 int 值并将其存储在 int 数组中

c - printf ("%8lx", int) 正在打印 16 个字符

ios - SWIFT:var someVariable:int = textfield.text.toInt() x textfield2.text.toInt() 并强制展开

c - fprintf、printf 和 sprintf 之间的区别?

c++ - Visual Studio中的sprintf错误

c - 如何访问时间结构的字段

char [] 和 sprintf 段错误

c - 用于图像直方图的串行和并行(使用 mpi)代码

java - 逐位比较两个 4 位整数