使用snprintf打印数组?备择方案?

时间:2013-06-05 13:55:21

标签: c printf

是否可以使用snprintf打印数组?我知道它可能需要多个参数,并且它至少与格式化字符串建议的数量一样多,但如果我只给它1个格式化字符串和一个值数组,它会将整个数组打印到缓冲区吗?

我问的原因是因为我正在修改源代码,而当前的实现只支持将一个值放在一个字符串中,但我正在修改它以支持一组值。我想尽可能少地改变原始实现。

如果这不起作用,是否有其他方式建议人员这样做?我应该把它搞砸并使用for循环(如果没有字符串缓冲区,它真的有用吗?)

基本上:将返回的双精度数组中的所有值放到同一个字符串中的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

不,没有格式说明符。

当然,请使用循环。您可以使用snprintf()打印前面的每个双精度数,因此您永远不需要复制字符串:

double a[] = { 1, 2, 3 };
char outbuf[128], *put = outbuf;

for(int = 0; i < sizeof a / sizeof *a; ++i)
{
  put += snprintf(put, sizeof outbuf - (put - outbuf), "%f ", a[i]);
}

以上是未经测试的,但您可以得到一般的想法。它用一个空格分隔每个数字,并且还会发出一个可能很烦人的尾随空格。

保护自己免受缓冲区溢出的影响不大,通常对于这样的代码,您可以知道输入的范围,并确保outbuf足够大。对于生产代码,您当然需要考虑这一点,这里的重点是展示如何解决核心问题。

答案 1 :(得分:0)

我决定这样做:

int ptr = 0;
for( i = 0; i < size; i++)
{
    ptr += snprintf(outbuf + ptr, sizeof(outbuf) - ptr, "%.15f ", values[i]);   
}

略有不同,但效果与@unwind的解决方案相同。我从snprintf() <{1}}获得了这个想法。{{1}}