##sprintf, snprintf, vsnprintf 的使用
一,sprintf函数
在需要整理、格式化字符串时,sprintf就大显身手了。
函数原型:
int sprintf(char *string, char *format [,argument,...]);
-
string:指向字符数组的指针,该数组存储了C字符串。
-
format:格式化的字符串
-
argument:根据语法格式替换format中%标签
-
返回值:格式化字符转的实际长度
#include <iostream>
using namespace std;
#include <string>
int main(int argc, char *argv[])
{
double tempData = 17.67, humiData = 28.675;
char buffer[40] = {0};
int num = sprintf(buffer, "temperature: %lf; humidity:%lf\r\n", tempData, humiData);
cout << "num: " << num << endl;
cout << buffer << endl;
return 0;
}
控制台输出:
num: 44
temperature: 17.670000; humidity:28.675000
二,snprintf函数
函数原型:
int snprintf(char *str, size_t size, const char *format, ...)
两点注意:
(1) 如果格式化后的字符串长度 < size,则将格式化的字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’);
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(‘\0’),返回值为欲写入的字符串长度。
#include <iostream>
using namespace std;
#include <string>
int main(int argc, char *argv[])
{
double tempData = 17.67, humiData = 28.675;
char buffer[40] = {0};
int num = snprintf(buffer, 5+1, "temperature: %lf; humidity:%lf\r\n", tempData, humiData);
cout << "num: " << num << endl;
cout << buffer << endl;
return 0;
}
控制台输出:
num: 44
tempe
三,sprintf函数 与 snprintf函数的区别
虽然sprintf和snprintf函数都是用于格式化字符串的,但是它们还是会有区别
1.返回值的含义不同
sprintf函数返回的是实际输出到字符串缓冲中的字符个数
snprintf函数的返回值参考 二,snprintf函数
2.安全性不同
sprintf可能导致缓冲区溢出使得程序崩溃,而且bug不易查找
snprintf通过提供缓冲区的可用大小传入参数来保证缓冲区的不溢出,如果超出缓冲区大小则进行截断。
直接看实例会更容易理解
由于buffer的实际长度44大于给出的40,导致buffer缓冲区溢出
buffer的实际长度44,但我只往buffer里面存6个字符,给出的40足够了,因此snprintf更安全
四,vsnprintf函数
vsnprintf函数:C标准库函数-<starg.h> c++中<stdarg.h>
函数原型:
int vsnprintf(char *s, size_t n, const char *format, va_list arg)
功能:将格式化的可变参数列表写入n大小的缓冲区,如果在printf上使用格式,则使用相同的文本组成字符串,如果使用arg标识的变量则将参数列表中的元素作为字符串存储在char型指针s中。
- 参数
s:指向存储结果C字符串的缓冲区的指针。
n:要转换的字符的长度(bytes)
formate:可变参数
arg:申请参数列表的变量,标识使用va_start初始化的变量参数列表的值。 - 返回值
如果n值足够大,则会写入字符数,但是不包括’\0’的终止符。如果发生编码错误则返回值小于0。
注:只有返回值是非负且小于n时,字符串才完全被写入。
#include <stdio.h>
#include <stdarg.h>
#define MAXLEN 20
int test_log(char* format, ...)
{
char str_tmp[MAXLEN];
int i=0,j=0;
va_list arg;
va_start (arg, format);
i=vsnprintf(str_tmp, MAXLEN, format, arg);
va_end(arg);
printf("%s", str_tmp);
return i;
}
void main()
{
int i=test_log("This is vsprintf test:%s%d\n","string",1024);
}
控制台输出:
This is vsprintf test:string1024