主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。
主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。
将可变个参数(…)按照format格式化成字符串,然后将其复制到str中。
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’);
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(‘\0’),返回值为欲写入的字符串长度。
int sprintf(char *string, char *format [,argument,...]);
string:这是指向一个字符数组的指针,该数组存储了最终格式化后的 字符串。
format:指明字符串的格式,包含了要被写入到字符串 str 的文本。它可以嵌入随后的附加参数中指定的值替换(如(“%d%c%f”, num, chr, f),参数的个数应与 % 标签的个数相同。),按需求进行格式化。
[argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签,如(“%d%c%f”, num, chr, f)。参数的个数应与 % 标签的个数相同。
如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5。
int snprintf(char* dest_str,size_t size,const char* format,...);
dest_str:这是指向一个字符数组的指针,该数组存储了最终格式化后的 字符串。
size:对格式化字符串的长度做出限制,
format:指明字符串的格式,包含了要被写入到字符串 str 的文本。它可以嵌入随后的附加参数中指定的值替换(如(“格式化为%d%c%f”, num, chr, f)),按需求进行格式化。
若成功则返回预写入的字符串长度,若出错则返回负值。
与snprintf的返回值不同,sprintf的返回值是成功写入的字符串长度,此处需要谨慎处理。
(1)从函数命名上 snprintf 比 sprintf多出了一个n,函数定义上,多出了第二个参数n 用来控制输出字符的最大数量,其控制生成的字符长度最多为n-1,为附加的终止空字符留出空间。
(2)因此 snprintf 是一个较为安全的函数,相比 sprintf 它可以避免缓冲区溢出问题, 如果输出的字符长度超过 n,它可以被自动截断。
(3)在函数的返回值上,snprintf 和 sprintf 返回的都是 预期被写入到缓冲区的字符串长度(不包括终止符)。 对于snprintf来说,由于支持长度限制、自动截断的能力,因此它的返回值可能比实际写入到缓冲区的长度大。
#include
int main( void )
{
char buffer[200];
char s[] = "hello world";//字符串数组
char c = 'c';//字符
int i = 8;//整型
int length;
float fp = 3.1415926f;//浮点型
// 格式化并打印各种数据到buffer
length = sprintf( buffer, " String: %s\n", s ); // 字符串数组
length += sprintf( buffer + length , " Character: %c\n", c ); // 字符
length += sprintf( buffer + length , " Integer: %d\n", i ); // 整型
length += sprintf( buffer + length , " Float: %f\n", fp );// 浮点型
printf( "Output:\n%s\ncharacter string_length = %d\n", buffer, length);
return 0;
}
输出结果:
#include
#include
int main()
{
char str[10]={0};
int str_len=snprintf(str,sizeof(str),"123456789012345678");
printf("str = %s\n",str);
printf("write_len = %d\n",strlen(str));//打印格式化字符串的实际长度
printf("str_len = %d\n",str_len);//打印snprintf返回值
return 0;
}
编译警告:从编译警告可以看出snprintf所发挥的作用,当要格式化的字符串超出buffer长度时,snprintf函数的size参数就可以起到避免溢出的效果.
而如果此时使用sprintf,就会造成buffer溢出。
输出结果: