C语言可变参数使用介绍

我们可能常常在linux c中看见一些函数,特别是输出函数,或可以格式转化的函数,比如printf等函数,他的参数是可变的。

int printf(const char *format, ...);
       int vprintf(const char *format, va_list ap);
       int vfprintf(FILE *stream, const char *format, va_list ap);
       int vsprintf(char *str, const char *format, va_list ap);
       int vsnprintf(char *str, size_t size, const char *format, va_list ap);

那么该如何编写自己的变参函数呢,这就要用到处理变参的三个方法:va_start, va_arg, va_end , 这三个方法包含在头文件 stdarg.h 中,这三个方法的原型为:

va_list ap;                        //首先定义一个va_list类型的变量
void va_start(va_list ap, last);   //va_start 的第一个参数为va_list变量,第二个参数为函数的最后一个固定参数 
void va_end(va_list ap);           //用va_end结束迭代, ap is undefined

type va_arg(va_list ap, type);

特别是在这中函数里面,我们进行格式转化时,使用:int_vsnprintf(char*str,size_tsize,constchar*format,va_listap);

vsnprintf,C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。

头文件:
#include <stdarg.h>
函数声明:
int_vsnprintf(char*str,size_tsize,constchar*format,va_listap);
参数说明:
char *str [out],把生成的格式化的字符串存放在这里.
size_t size [in], str可接受的最大字节数,防止产生数组越界.
const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。例如" %d,%d\n " ;  "my age is :" "%d years old\n" ;
va_list ap [in], va_list变量. va:variable-argument:可变参数(就是后面...中所包含的内容,存到这个变参数的变量当中去)
函数功能:将可变参数格式化输出到一个字符数组。
用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。
返回值:执行成功,返回写入到字符数组str中的字符个数(不包含终止符),最大不超过size;执行失败,返回负值,并置errno.[1] 

备注:
linux环境下是:vsnprintf
VC6环境下是:_vsnprintf

==================================================================

   涉及到的…的替代方式:

    __VA_ARGS__
  • 变长数据的读取方式
    va_start(args,fmt);
    size_t buf_len = vsnprintf(buffer,MAX_LOG_LEN, str_format,args);
    va_end(args);

可变参数的实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>


void sumq(char *fmt , ...)
{
	va_list args;
	va_start(args , fmt);//va_start 的第一个参数为va_list变量,第二个参数为函数的最后一个固定参数
	char buff[1024];
	vsnprintf(buff, 1023 , fmt , args);

	printf("%s\n",buff);
	va_end(args);

}

int main()
{
   	int age = 78;
	sumq("hello world");
	sumq("hello %d",2345);
	sumq("hellomyageis:""%d yearsols",age);
	return 0;
}

日志功能部分后面部分再加上去。

扫描二维码关注公众号,回复: 3466835 查看本文章

https://blog.csdn.net/zhang197093/article/details/76400380

https://blog.csdn.net/yyyyyyyyyywwwwwwwwww/article/details/49927611

https://blog.csdn.net/wusuopubupt/article/details/38817949

猜你喜欢

转载自blog.csdn.net/lailaiquququ11/article/details/82467948