6

是否有可能用于snprintf打印数组?我知道它可以接受多个参数,并且它期望至少与您的格式化字符串所建议的一样多,但是如果我只给它一个格式化字符串和一个值数组,它会将整个数组打印到缓冲区吗?

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

如果这不起作用,是否有人会推荐另一种方法来做到这一点?我应该把它吸起来并使用一个 for 循环(如果没有字符串缓冲区,这将如何真正有效)?

本质上:将所有值从双精度数组中获取到相同字符串以返回的最佳方法是什么?

4

2 回答 2

5

不,没有格式说明符。

当然,使用循环。您可以使用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足够大。对于生产代码,您当然需要考虑这一点,这里的重点是展示如何解决核心问题。

于 2013-06-05T13:56:47.203 回答
0

我决定这样做:

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

略有不同,但与@unwind 的解决方案中的效果相同。我从参考页面得到了这个想法snprintf()

于 2013-06-05T14:41:03.613 回答