linux C 可变参数配合vsnprintf的使用
可变参数简介
大多时候开发时函数入参数量是确定的,但在特定情况下会有可变数量参数的需求。
在C语言中提供了一个解决方案,需要引用头文件 :#include <stdarg.h>
一、函数接口介绍
1、void va_start (va_list ap, last);
ap:va_list 类型的变量,指向参数的指针
last:最后一个显式声明的参数,以用来获取第一个变长参数的位置2、type va_arg(va_list ap, type);
ap:va_list 类型的变量,指向参数的指针
type:指要获取的参数的类型3、void va_end(va_list ap);
ap:va_list 类型的变量,指向参数的指针4、void va_copy(va_list dest, va_list src);
- __va_start与va_end是成对被调用的,
- 开始的时候被调用va_start,获得各输出变量地址
- 结束的时候被调用va_end,释放相应的资源__
示例代码如下:
#include <stdio.h>
#include <stdarg.h>
double average(int num, ...)
{undefinedva_list valist;double sum = 0.0;int i; /* 为 num 个参数初始化 valist */ va_start(valist, num); /* 访问所有赋给 valist 的参数 */for (i = 0; i < num; i++){sum += va_arg(valist, int);}/* 清理为 valist 保留的内存 */va_end(valist);return sum/num;
}int main()
{undefinedprintf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}
设计日志打印函数时可使用这一特性,使用vsnprintf()实现snprintf()功能,示例代码如下:
void log_print(const char *format, ...)
{char errMsg[MSG_LEN] = {0};va_list ap;if (NULL == format){return;}va_start(ap, format); //获得可变参数列表vsnprintf (errMsg, MSG_LEN, format, ap); //写入字符串va_end(ap);//释放资源printf("%s", errMsg);//打印字符串
}int main()
{char *temp = "world";char *temp1 = "world !!";log_print("hello %s", temp );log_print("hello %s %s", temp , temp1);return 0;
}
linux C 可变参数配合vsnprintf的使用相关推荐
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
在阅读代码的时候,在一个宏定义语句中,发现了个之前未曾见过的编译器预定义宏:"__VA_ARGS__".当时,从代码语句中推测它代表宏参数:"-"(本文称之为省 ...
- 【读书笔记】【程序员的自我修养 -- 链接、装载与库(三)】函数调用与栈(this指针、返回值传递临时对象构建栈、运行库与多线程、_main函数、系统调用与中断向量表、Win32、可变参数、大小端
文章目录 前言 介绍 内存 内存布局 栈与调用惯例 堆与内存管理 运行库 入口函数和程序初始化 C/C++运行库 运行库与多线程 C++全局构造与析构 fread 实现 系统调用与API 系统调用介绍 ...
- _vsnprintf在可变参数打印中的用法
_vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...
- 可变参数__VA_ARGS__使用和va_list使用小结
1. #用来把参数转换成字符串 #define P(A) printf("%s:%d\n",#A,A); #define SQUARE(x) printf("The sq ...
- c语言理解参数,c语言中对可变参数列表的简单理解
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...
- C语言中可变参数列表
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105113526 可 ...
- 参数控制c语言代码走向,C语言可变参数完全解读
本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...
最新文章
- Java学习总结:16
- 如何查看 phtml文件 并有代码颜色提示
- 南通工学院计算机97级,2021年南通理工学院录取结果查询网址入口及录取结果公布时间...
- 2011年9月19日 面试重点:asp.net运行原理和生命周期
- SSH中为什么action需要用多例而dao层和service层为什么就用单例就可以
- jetty java 禁用目录列表_java – 如何禁用Jetty的WebAppContext目录列表?
- LeetCode 1522. Diameter of N-Ary Tree(递归)
- java封装 1210 速记
- 全球唯一!华为nova5系列:有望搭载全新7nmSoC
- geohash美团附近酒店搜索-技术方案
- 舞伴配对问题c语言实训报告,数据结构-舞伴配对实训.docx
- 计算机一级考试有填空题嘛,计算机一级考试填空题
- javaweb_util_excel模板横向纵向循环
- sv常用的系统function/task(一)
- Hibernate之load和get的区别
- 游戏运营是什么?运营专员需要具备什么能力?
- python支持的编程方式包括,python的两种编程方式是什么
- HTML+CSS做的商城页面
- for循环canvas渲染图片
- 开启xmp1还是2_玩机鸭x:手机开启“强制进行GPU渲染”功能对手机有什么影响?...
热门文章
- poj 1833 排列 STL 全排列公式
- 解决:wamp一直显示橙色无法变绿
- AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解
- springboot实现邮件任务(简单文本,图片附件,验证码模板)
- 关于apk签名文件格式从.keystore转换成.jks的记载
- python: numba 加速python的 for loop
- php redirect导致重复请求,微信公众平台网页登录授权多次重定向跳转,导致code使用多次问题...
- U盘安装DEEPIN的方法
- STM32 F4 OV2640摄像头学习笔记(二)
- 时间序列模型-ARIMA