这4个函数在一些软件代码中经常出现,他们的功能是C中用于格式化输出功能,所谓“格式化”可以理解为“转换”,也可以理解为“筛选”。我们先逐个分析这4个函数。
函数原型:
int sprintf(char *str, const char *format, ...);
参数:str -- 字符串数组指针,该数组用于存储格式化后的C字符串。
format -- 格式化模式参数
返回值:成功则返回写入的字符总是,不包括追加的那个'\0', 失败,则返回负数。
这个我们用的比较多,简单的说,该函数可以将 各种类型的整数、字符串、浮点数等等,转换成一个字符串,存放在str指向的内存区域。
实例:
#include
int main()
{
char str[100];
int a = 100;
sprintf(str, "a value is:%d", a);
printf("%s", str);
return 0;
}
该函数相比sprintf,名字中多了一个’n’,这里的’n’可以理解为num,对应要格式化的字节数。
函数原型:
int snprintf(char *str, size_t size, const char *format, ...);
参数: str -- 目标字符串。
size -- 拷贝的字节数(bytes).
format -- 格式化参数
... -- 可变参数。
返回值:
(1)如果格式化后的字符串长度小于等于size,则会把字符串全部拷贝到str中,
并且给其后添加一个字符串结束符'\0'.
(2) 如果格式化后的字符串长度大于size,则超过size的部分会被截断,只将其中
的(size - 1)个字符赋值到str中,并且添加字符串结束符'\0',返回值为-1
实例1:
#include
int main()
{
int len;
char str[100];
char *s = "1234567890";
len = snprintf(str, 100, "%s\n", s);
printf("str:%s\n count:%d\n", str, len);
return 0;
}
#include
int main()
{
int len;
char str[100];
char *s = "1234567890";
len = snprintf(str, 6, "%s\n", s);
printf("str:%s\ncount:%d\n", str, len);
return 0;
}
该函数相比sprintf多了一个’v’, 这里的v可以理解为 var ist,也就是使用参数列表格式化输出到字符串中。
函数原型:
int vsprintf(char *str, const char *format, va_list arg);
参数:str -- 目标字符串。
format -- 格式化模式
arg -- 可变参数列表对象,应呗中定义的va_start 宏初始化。
返回值:
如果成功,则返回写入的字符总数,否则返回一个负值。
实例:
#include
#include
static char str[100];
int vsprintf_test(char *format, ...)
{
va_list aptr;
int ret;
va_start(aptr, format);
ret = vsprintf(str, format, aptr);
va_end(aptr);
return ret;
}
int main()
{
int i = 5;
float f = 66.6;
char *s = "abcdefgf";
int len;
len = vsprintf_test("%d %f %s", i, f, s);
printf("%s\nlen:%d", str, len);
return 0;
}
该函数比较 snprintf,多了1个"v",这里的 v可以理解为 var_list,也就是可变参数列表。其他使用类似。
函数原型:
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
参数:str -- 目标字符串。
size -- 最大格式化的字符长度。
format -- 格式化模式
arg -- 可变参数列表对象,应呗中定义的va_start 宏初始化。
参数
1、名字中包含’n’的限制了格式化输出的最大字节数,这样有一个好处,加了一道保险,就是防止了内存溢出。
2、名字中包含‘v’的,表示支持可变参数列表。