有没有C函数(或方法)能够将格式化的字符串转换成普通字符串呢?
例如:
printf("this is %s", "a message")
我想把printf()
的输出"this is a message"
存储在一个char*
变量中。这应该很简单,但除了将其写入文件并读取它或根据需要多次连接之外,我没有找到其他方法。
那么,在C语言中有没有一种函数或更简单的方法可以将任何格式的字符串放入单个字符串变量中呢?
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
则不能。
char buf[8]; snprintf(buf, sizeof buf, "del %s", "c:\\junk.txt"); cmd(buf);
看起来不太安全。 - chux - Reinstate Monican
时,字符串才被完全写入。” - ForceBru使用sprintf
:
sprintf( var, "this is %s", "a message" );
var
必须足够大以存储最终字符串(包括字符串终止符)。sprintf()
/snprintf()
。snprintf()
函数
它将格式化的字符串写入作为第一个参数提供的数组中。
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
snprintf
函数与fprintf
函数等价,除了输出被写入到一个数组(由参数s
指定)而不是流中。