2

是否有一个函数可以用来预测 sprintf() 需要的空间?IOW,我可以调用一个函数 size_t predict_space( "%s\n", some_string ) 来返回由 sprintf( "%s\n", some_string ) 产生的 C 字符串的长度吗?

4

4 回答 4

9

C99中 snprintf (注意:Windows 和 SUSv2,不提供符合标准的 snprintf(或 _snprintf)的实现)

       7.19.6.5 snprintf 函数

       概要

       [#1]

               #include <stdio.h>
               int snprintf(char * 限制 s, size_t n,
                       const char * 限制格式,...);

       描述

       [#2] snprintf 函数等价于 fprintf,除了
       将输出写入数组(由
       参数 s) 而不是流。如果 n 为零,则无
       被写入,并且 s 可能是一个空指针。否则,输出
       第 n-1 个字符以外的字符被丢弃而不是被
       写入数组,并在
       实际写入数组的字符的末尾。如果
       复制发生在重叠的对象之间,
       行为未定义。

       退货

       [#3] snprintf函数返回字符数
       如果 n 足够大,那会被写出来,
       不计算终止的空字符或负数
       发生编码错误时的值。因此,零
       当且仅当终止输出已被完全写入
       返回值为非负且小于 n。

例如:

len = snprintf(NULL, 0, "%s\n", some_string);
if (len > 0) {
    newstring = malloc(len + 1);
    if (newstring) {
        snprintf(newstring, len + 1, "%s\n", some_string);
    }
}
于 2011-03-17T11:40:48.130 回答
6

使用可以使用大小为 0 的 snprintf() 来准确找出需要多少字节。代价是字符串实际上被格式化了两次。

于 2011-03-17T11:38:49.850 回答
2

您可以使用snprintf它,如

sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);

但请参阅Autoconf在snprintf.

于 2011-03-17T11:41:18.667 回答
2

在大多数情况下,您可以通过添加要连接的字符串的长度并根据您使用的格式获取数值的最大长度来计算它。

于 2011-03-17T11:43:58.427 回答