是否有任何C函数(或方法)将格式化字符串作为普通字符串?
例如:
printf("this is %s", "a message")
我想在printf()
变量中"this is a message"
输出char*
。这应该很简单,但除了将其写入文件并根据需要读取或连接多次之外,我不会附带任何东西。
那么,是否有一种函数或简单的方法将任何格式化的字符串放入C中的单个字符串变量中?
答案 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,这些函数不处理对提供的缓冲区(数组)的内存分配(或检查)。在传递数组时,您需要确保目标足够长以保存最终结果。