博客搬家,原地址:https://langzi989.github.io/2018/01/01/C中snprintf与vsnprintf函数/
虽然snprintf函数在开发过程中比较常用,但是其中有一些细节性的问题需要注意。因为snprintf函数不是C中的标准函数,不同的编译器可能对该函数的实现不同,本文说明是基于GCC编译器。
1、snprintf函数
1.1 函数原型
snprintf函数的作用是将格式化的数据写入字符串。其函数原型如下:
snprintf(char* buffer, int n, char* format, ...);
1.2 参数说明
- buffer : 存储格式化字符串的buffer
- n : 指定格式化字符串的大小,包括\0
- format : 指定需要格式化字符串的format
- … : 可变参数
1.3 返回值
该函数的返回值为其期望字符串的长度,而不是实际存入buffer中的字符串的长度。且不包括\0。
1.4 注意点
特别注意函数原型中的第二个参数包括\0的大小,而返回值为期望大小且不包括\0。
例:
char buffer[256];
//返回值ret = 13,buffer中的内容为123456789
int ret = snprintf(buffer, 10, "%s", "1234567890abc");
memset(buffer, 0x0, sizeof(buffer));
//返回值ret = 3,buffer中的内容为123
ret =snprintf(buffer, 10, "%s", "123");
2、 snprintf与vsnprintf
snprintf和vsnprintf都是C语言printf家族函数的成员。实际上,snprintf和vsnprintf功能完全一样,只是vsnprintf将snprintf中的可变参数换成了av_list类型。如下:
#include <stdio.h>
int printf(const char* format, ...); //输出到标准输出
int fprintf(FILE* stream, const char* format, ...); //输出到文件
int sprintf(char* buffer, const char* format, ...); //输出到字符串
int snprintf(char* buffer, int n, const char* format, ...); //输出到字符串
#include <stdarg.h>
int vprintf(const char* format, va_list ap); //输出到标准输出
int vfprintf(FILE* stream, const char* format, va_list ap); //输出到文件
int vsprintf(char* buffer, const char* format, va_list ap); //输出到字符串
int vsnprintf(char* buffer, int n, const char* format, va_list ap); //输出到字符串
2.1 va_list获取
可变参数va_list获取方式通过下列函数获取,并且总是成对调用
va_start(va_list ap, last);
va_end(va_list ap);
2.2 简单的使用vsnprintf函数实现snprintf
#include <stdio.h>
#include <stdarg.h>
int my_snprintf(char* buffer, int size, const char* format, ...) {
va_list ap;
va_start(ap, format);
int ret = vsnprintf(buffer, size, format, ap);
va_end(ap);
return ret;
}