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

Nea*_*lon 6 c printf

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

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

如果这不起作用,有人会推荐另一种方法吗?我应该把它搞定并使用 for 循环(如果没有 stringbuffers,它真的能工作得有多好)?

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

unw*_*ind 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]);
}
Run Code Online (Sandbox Code Playgroud)

以上内容未经测试,但您已大致了解。它用一个空格分隔每个数字,并发出一个可能令人讨厌的尾随空格。

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


Nea*_*lon 0

我决定这样做:

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

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

  • 上面的代码不能防止缓冲区溢出。snprintf 的第二个参数是一个无符号 (size_t),这意味着如果此参数作为有符号为负,它将被转换为一个大的无符号数,并可能导致缓冲区溢出。请注意,snprintf 不返回实际写入的字节数,而是返回如果有足够的可用空间则应写入的字节数。 (2认同)