C 预测sprintf()和#x27;爱德线?

C 预测sprintf()和#x27;爱德线?,c,printf,string-length,C,Printf,String Length,有没有一个函数可以用来预测sprintf()需要的空间?那么,我是否可以调用一个函数size\u t predict\u space(“%s\n”,some\u string),该函数将返回由sprintf生成的C字符串的长度(“%s\n”,some\u string)?Use可以使用大小为0的snprintf()来确定需要多少字节。价格是字符串实际上被格式化了两次。在C99中snprintf(注意:Windows和SUSv2不提供符合标准的snprintf(或_snprintf)实现): 您可

有没有一个函数可以用来预测sprintf()需要的空间?那么,我是否可以调用一个函数size\u t predict\u space(“%s\n”,some\u string),该函数将返回由sprintf生成的C字符串的长度(“%s\n”,some\u string)?

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

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


您可以使用
snprintf
,如中所示

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

但是请参见
snprintf上的Autoconf

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

小心。提取手册页:snprintf()函数返回格式化的字符数,即如果缓冲区足够大,将写入缓冲区的字符数。如果调用snprintf()时n的值为0,则返回小于1的未指定值。@Benoit:这不是标准描述的行为。关于snprintf的返回值,SUSv2和C99标准相互矛盾:当使用size=0调用snprintf时,SUSv2规定未指定的返回值小于1,而C99允许str在这种情况下为NULL,并给出返回值(一如既往)由于在输出字符串足够大的情况下会写入的字符数。但是,SUSv4规定了所需的行为。但是,通常会将n==1传递给snprintf(有时)当传递n==0时不起作用。SUSv3与C99对齐,因此也规定了所需的行为。为什么不在
某些字符串上使用
strlen
,并使用它来计算需要多少空间?@MAK推测OP需要一个通用的解决方案,可以使用不同的格式说明符和多个参数。根据答案,
snprintf
可能是正确的选择。在没有该功能的系统中,我们使用了
文件*fh=fopen(“/dev/null”,“w”)
,然后使用
x=fprintf(fh,fmtstr,blah,blah,blah)获取长度。警告:关于snprintf的返回值,SUSv2和C99标准相互矛盾:当使用size=0调用snprintf时,SUSv2规定未指定的返回值小于1,而C99允许str在这种情况下为NULL,并给出返回值(一如既往)由于在输出字符串足够大的情况下会写入的字符数。可能不可移植:关于snprintf的返回值,SUSv2和C99标准相互矛盾:当以size=0调用snprintf时,SUSv2规定的未指定返回值小于1,而C99允许str在这种情况下为NULL,并给出返回值(一如既往)作为在输出字符串足够大的情况下写入的字符数。@Benoit,您可能会使用类似于
char x;int len=snprintf(&x,1,fmtstr,blah,blah,blah,blah)的内容在那种情况下。
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);
    }
}
sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);