c 语言函数可变參数的处理
/*************************************************************************
> File Name: va_list.c
> Author: zshh0604
> Mail: zshh0604@.com
> Created Time: 2014年10月14日 星期二 15时16分09秒
************************************************************************/
#include<stdio.h>
/***
在 c中使用可变參数, c语言中提供一个va_list类型要存储函数的可变參数。 1.在c语言中定义函数的可变參数方法例如以下: 一:该參数必须在最后。 二:最后一个參数必须声明可变參数的类型。例如以下
三:能够參数是使用三点表示。 四:在函数调用的使用通过fmt这个字符參数进行參数类型和參数个数的设定。如:"%s%d%c%f" void test(char *fmt,...); 2.假设使用可变參数。 c提供一个例如以下一组函数:
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
对可变參数进行操作。函数原型。 void va_start(va_list ap,last); 函数功能:
将ap依次指向可变參数。
函数參数:
ap:会依次指向每个可变參数。 last:是fmt,它的作用是,规定了參数可变參数的个数。和类型。
函数返回值:
没有返回值。 在调用该组函数之前必须先调用va_start()函数。 通过fmt格式化字符中的格式。来一次获取该參数的值。 char *s;
int d;
char c;
while(*fmt)
{
switch(*fmt++)
{
case 's':
s = va_arg(ap, char *);
break;
case 'd':
d = va_arg(ap, int);
break;
case 'c':
c = va_arg(ap, char);
break;
}
}
va_end(ap);
在函数结束前,必须调用va_end()函数。 使用vsnprintf()直接使用ap. vsnprintf():函数原型例如以下:
int vsnprintf(char *str, size_t size, const char *format, va_list ap); 该方法使用例如以下: // va_list 的作用:
// 头文件<stdarg.h>提供了遍历未知数据和类型的函数參数表的功能。
// 那么,在函数f内声明一个类型为va_list的变量ap.它将依次指向每个实际的參数。
//
// va_list ap;
//
// 在訪问不论什么未命名的參数前,必须使用va_start宏初始化ap一次。 //
// va_start(va_list ap,lastarg);
//
// 此后每次运行宏va_arg都将产生一个与下一个未命令的參数具有同样类型和数值的值。 // 它同一时候还改动ap,以使得下一次运行va_arg时返回下一个參数。
//
// 类型 va_arg(va_list ap,类型);
//
// void ve_end(va_list ap);
//
// 在全部处理的參数处理完成之后。且在退出f之前。必须调用宏va_end一次。 //
// void va_end(va_list ap); **/ /*************************************************************************
> File Name: snprintf.c
> Author: zshh0604
> Mail: zshh0604@.com
> Created Time: 2014年10月14日 星期二 13时21分13秒
************************************************************************/
#include<stdlib.h>
#include<stdio.h>
#include<stdarg.h>
char * make_message(const char *fmt, ...)
{ int n; /* 用来记录vsnprintf()的返回之。 假设这个值小于等于-1,寿命。分配的空间不够。 假设这个值大于-1,可是n不小于size,那么应该把该值加1,(size+1),否则将空间加大一倍 ***/ int size = 100; /* Guess we need no more than 100 bytes. */
char *p, *np;
va_list ap; if ((p = malloc(size)) == NULL)
return NULL;
while (1) {
/* Try to print in the allocated space. */ va_start(ap, fmt); //通过这个函数,使得ap指向可变參数中每个參数。
n = vsnprintf(p, size, fmt, ap); //将ap指向的參数格式化到p中。 p的最大大小为size.依照fmt格式打印。 va_end(ap); //使用结束之后,调用va_end(ap);函数。 /* If that worked, return the string. */ if (n > -1 && n < size)
return p; /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */
size = n+1; /* precisely what is needed */
else /* glibc 2.0 */
size *= 2; /* twice the old size */ if ((np = realloc (p, size)) == NULL) { free(p);
return NULL;
} else {
p = np;
}
}
}
c 语言函数可变參数的处理的更多相关文章
- C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数
在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...
- OC可变參数的函数实现va_start、va_end、va_list的使用
一.简单介绍 我们常常在编程的时候看见类似这种代码,如图1.1 图1.1 或者是这种可变參数,如图1.2 图1.2 二.基本知识介绍 在学习怎样写这样的格式的函数前,先简介几个经常使用的宏: 下面摘自 ...
- python可变參数调用函数问题
一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...
- Effective JavaScript Item 22 使用arguments来创建接受可变參数列表的函数
本系列作为Effective JavaScript的读书笔记. 在Item 21中,介绍了结合apply方法实现的可变參数列表函数average,它实际上仅仅声明了一个数组作为參数,可是利用apply ...
- Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表
本系列作为Effective JavaScript的读书笔记. 以下是一个拥有可变參数列表的方法的典型样例: average(1, 2, 3); // 2 average(1); // 1 avera ...
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)
各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...
- C语言变长參数的认识以及宏实现
1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为con ...
- C语言中main函数的參数具体解释
main函数的定义形式 main函数能够不带參数,也能够带參数,这个參数能够觉得是 main函数的形式參数.C语言规定main函数的參数仅仅能有两个,习惯上这两个參数写为argc和ar ...
- Printf可变參数使用
參考文档: http://bbs.csdn.net/topics/70288067 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 本文的二 ...
随机推荐
- 南海区行政审批管理系统接口规范v0.3(规划) 5.投资项目联合审批系统API 5.1.【uploadFile】证件文书附件上传
- [HTML5] 新标签解释及用法
转自:http://www.cnblogs.com/yuzhongwusan/archive/2011/11/17/2252208.html HTML 5 是一个新的网络标准,目标在于取代现有的 HT ...
- [luogu P5349] 幂 解题报告 (分治FFT)
interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...
- UVA-12578 10:6:2 计算几何 模拟
题面 题意:给你一块长方形,告诉你长:宽=10:6 里面有一个圆,长:半径=5:1,给你长方形的长,求圆的面积和剩余部分的面积 题解:直接模拟输出就好 #include<bits/stdc++. ...
- js设计模式-工厂模式(抽象工厂)
场景:定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家(工厂)去实现,出售的产品均是电子产品(返回的对象为电子产品对象,即 ...
- RabbitMQ消息队列服务
MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 一个软件它 ...
- 多线程之HttpClient
在程序用调用 Http 接口.请求 http 资源.编写 http 爬虫等的时候都需要在程序集中进行 Http 请求. 很多人习惯的 WebClient.HttpWebRequest 在 TPL 下很 ...
- [hihocoder][Offer收割]编程练习赛45
互补二元组 Xi + Xj = Yi + Yj等价于Xi - Yi + Xj - Yj = 0 ,对每个二元组计算其x与y的差,每次加上其相反数的个数. #pragma comment(linker, ...
- 用LyX写中文幻灯片
虽然在虚拟机装了texlive以备使用,但是在不动CTeX的情况下,是否能使用LyX写中文幻灯片呢.网上只是寥寥几篇大神们在Linux用LyX的博文. 最近把论文交完写幻灯片,于是也把这个想法尝试了一 ...
- 在redhat6.4上编译z3求解器
因为项目需要,我们使用到了微软的z3求解器求约束,但是z3求解器在红帽平台上并没有发布编译好的二进制版本,而我们的运行环境是红帽的企业版6.4,因此需要自己编译相应的二进制. z3是由微软公司开发的一 ...