将printf存储在一个字符数组中?

5
有没有一种方法可以将printf的结果存储在一个字符数组中?
我需要设置一个字符串P: result,其中result是一个整数。
所以如果result = 4;
那么我需要一个包含"S: 4"char数组
其他方法也可以,但是我已经有了我的结果在printf中,所以我想知道是否可以直接获取它?

1
你可以使用sprintf函数,它可以将内容写入到字符缓冲区中。请确保你的缓冲区足够大(预期长度+1用于空终止符)。 - Rup
1
查找sprintf函数。 - Nick Beeuwsaert
2个回答

13

是的,你可以使用snprintf(比sprintf更安全的替代品)。snprintfprintf之间唯一的区别在于snprintf将输出写入到一个char *中,而不是直接写入标准输出:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char buffer[128];
    int result = 4;

    snprintf(buffer, sizeof(buffer), "S: %d", result);

    printf("%s\n", buffer);
    return 0;
}

应检查snprintf的结果,以确定是否需要更大的缓冲区或发生了其他错误。 - jxh
缓冲区大小被选择为具有足够的空间来容纳已知输入。渲染字符串的最大长度为13个字符。其他错误检查由于简洁起见被省略。 - Sean Bright
抱歉,我的评论应该以“一般来说,…”开头。 - jxh

4

使用sprintf很容易导致缓冲区溢出。snprintf更好,因为缓冲区溢出是由程序员告诉函数缓冲区比实际大小要大所导致的。 - jxh
@jxh 使用 snprintf()另一个答案中所示并不比这个答案好多少。它用一个_未检测到的_错误结果来交换一个糟糕的问题(在一般情况下可能会发生缓冲区溢出)。过于频繁地使用 snprintf() 会给人一种虚假的“安全”感,而没有检查 snprintf() 的结果。 - chux - Reinstate Monica
@chux:只要缓冲区大小正确,安全性就是真实的。错误结果是截断输出,当输出用于显示时通常不会成为停机点。但检查可能失败的函数的成功是标准操作程序(SOP),并且代码审查和静态代码分析工具应该能够找到这些问题。 - jxh
@jxh 只要缓冲区大小正确,sprintf() 也是安全的。我评论中“通常不会成为阻碍”的部分是虚假的安全感。char s[16], sprintf(s, sizeof s, "Target is %d %d", lat, lon); cmd(s); 同意使用带结果检查的 snprintf() 应该是标准操作程序(SOP)。 - chux - Reinstate Monica
@chux:GNU 提供了 asprintf 来实现这个功能。 - jxh
@jxh 确实存在各种良好的非标准C库替代品来解决sprintf()snprintf()的弱点。通常很容易找到asprintf()的源代码。在没有asprintf()的系统上很有用,或者需要改进asprintf()的情况下都可以考虑使用。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接