将格式化的字符串赋值给一个变量

4

有没有C函数(或方法)能够将格式化的字符串转换成普通字符串呢?

例如:

printf("this is %s", "a message")

我想把printf()的输出"this is a message"存储在一个char*变量中。这应该很简单,但除了将其写入文件并读取它或根据需要多次连接之外,我没有找到其他方法。

那么,在C语言中有没有一种函数或更简单的方法可以将任何格式的字符串放入单个字符串变量中呢?


可能是重复的问题,参考如何存储格式化后的C字符串 - phuclv
3个回答

8
你需要使用 sprintf 或者 snprintf 之一:

用法

char str[128];

//sprintf(str, "hello %s", "world");
snprintf(str, 128, "hello %s",  "world");

请注意,snprintf 更加安全,因为它会将字符串截断到遇到溢出的适当长度。

文档


为什么 snprintf 是安全的

snprintf 根据格式字符串 format 控制将输出写入字符串 str,指定如何转换后续参数进行输出。它类似于 sprintf(3),但是 size 指定要生成的最大字符数。尾随的空字符也计入此限制,因此必须至少为 str 分配 size 个字符。

如果 size 为零,则不会写入任何内容,并且 str 可以为 null。否则,超过第 n-1 个字符的输出将被丢弃而不是写入 str,并且空字符将写入实际写入 str 的字符的结尾。如果在重叠对象之间进行复制,则行为未定义。

成功时返回将写入的字符数,如果 size 足够大,则不计算终止的空字符。因此,只有返回值为非负且小于 size 时,以空字符结尾的输出才已完全写入。发生错误时,返回 -1(即编码错误)。

也就是说,snprintf 可以保护程序员免受缓冲区溢出的影响,而 sprintf 则不能。


"snprintf 更加安全" 嗯,如果不展示如何检测写入不完整,char buf[8]; snprintf(buf, sizeof buf, "del %s", "c:\\junk.txt"); cmd(buf); 看起来不太安全。 - chux - Reinstate Monica
1
所有的回答都很好,但这个回答简洁明了,给出了一个例子并链接到了文档。谢谢! - tvaz
@chux,这就是文档的作用。你需要做的唯一事情就是检查返回值。“请注意,只有当返回值为非负且小于n时,字符串才被完全写入。” - ForceBru
这个回答提到了“更安全”。但是文档中并没有提到。在我看来,如果没有展示正确的用法,“更安全”是不被支持的,因此有了这条评论。 - chux - Reinstate Monica
@chux,没问题,我添加了一些说明(比答案本身还要详细)。 - ForceBru

4

使用sprintf

sprintf( var, "this is %s", "a message" );

请注意,var必须足够大以存储最终字符串(包括字符串终止符)。

3
是的,你需要找的函数是sprintf()/snprintf()
引用C11, 章节 §7.21.6.5, snprintf()函数

int snprintf(char * restrict s, size_t n, const char * restrict format, ...);

snprintf函数与fprintf函数等价,除了输出被写入到一个数组(由参数s指定)而不是流中。

它将格式化的字符串写入作为第一个参数提供的数组中。
顺便说一下,这些函数不处理为提供的缓冲区(数组)分配(或检查)内存。在传递数组时,您需要确保目标足够长以容纳最终结果。

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