将格式化字符串转换为变量

时间:2016-01-13 19:15:14

标签: c string printf

是否有任何C函数(或方法)将格式化字符串作为普通字符串?

例如:

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

我想在printf()变量中"this is a message"输出char*。这应该很简单,但除了将其写入文件并根据需要读取或连接多次之外,我不会附带任何东西。

那么,是否有一种函数或简单的方法将任何格式化的字符串放入C中的单个字符串变量中?

3 个答案:

答案 0 :(得分:5)

您想要sprintf snprintf

用法

char str[128];

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

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

文档

为什么snprintf安全

  

snprintf在格式字符串格式的控制下将输出写入字符串str,指定后续参数如何转换为输出。它与sprintf(3)类似,只是size指定要生成的最大字符数。结尾的nul字符将计入此限制,因此您必须为size分配至少str个字符。

     

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

     

成功时,返回大小足够大的字符数,不包括终止字符。因此,当且仅当返回值是非负且小于大小时,才完全写入以空值终止的输出。出错时,返回-1(即编码错误)。

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

答案 1 :(得分:4)

使用sprintf

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

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

答案 2 :(得分:3)

是的,您所使用的功能是sprintf()/snprintf()

引用snprintf(),章节§7.21.6.5, int snprintf(char * restrict s, size_t n, const char * restrict format, ...);功能

  

snprintf

     

fprintf函数等效于s,但输出被写入   数组(由参数trunc()指定)而不是流。

它将格式化的字符串写入作为第一个参数提供的数组中。

FWIW,这些函数不处理对提供的缓冲区(数组)的内存分配(或检查)。在传递数组时,您需要确保目标足够长以保存最终结果。