2010-12-08 65 views
0

我想知道这是否是正确的方式concatenateNUL终止包括宽度的字符串。串联字符串和snprintf在c

#define FOO "foo" 
const char *bar = "bar"; 
int n = 10; 
float f = 10.2; 

char *s; 
int l; 

l = snprintf (NULL, 0, "%-6s %-10s %4d %4f",FOO, bar, n, f); 
s = malloc (l + 4); // should it be the number of formats tags? 
if (s == null) return 1; 
sprintf (s, "%-6s %-10s %4d %4f", FOO, bar, n, f); 
+0

为了维护目的,定义一个由`snprintf`和`sprintf`使用的格式字符串可能是个好主意。如果它在一个地方改变了,而不是另一个地方,它真的很糟糕! – 2010-12-08 03:23:19

+0

这听起来像是一个好主意,是否可以发布一个示例代码参考这个?谢谢 – Lucas 2010-12-08 03:27:21

回答

0

你只需要添加1snprintf()返回的值,因为只有一个加空终止符。

但是,您确实需要检查l == -1(表示snprintf()失败)。

1

很多系统在他们的标准C库中都有一个函数asprintf,它们完全符合你在这里所做的:allocate和sprintf