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 转载请标明来源 本文的二 ...
随机推荐
- TensorFlow——分布式的TensorFlow运行环境
当我们在大型的数据集上面进行深度学习的训练时,往往需要大量的运行资源,而且还要花费大量时间才能完成训练. 1.分布式TensorFlow的角色与原理 在分布式的TensorFlow中的角色分配如下: ...
- LeetCode Weekly Contest 18B
1. 496. Next Greater Element I 暴力的话,复杂度也就1000 * 1000 = 1e6, 在1s的时限内完全可以. 当然,有许多优化方法,利用stack维护递减序列的方法 ...
- 项目中遇到的所有ECharts图表集合
全放在了ECharts官网示例里面以后会一直往里面添加: https://gallery.echartsjs.com/explore.html?u=bd-2133619855&type=wor ...
- Vue报错笔记
1.错误信息:[Vue warn]: Property or method "object" is not defined on the instance but referenc ...
- 一款APP的开发设计是如何从0到1一步一步设计的
目前在行业里,关于APP界面设计规范也是层次不齐,很多都还停留在6的设备和ios 9的系统之上,而现在最新的是iphone 7和iOS 10了(更新换代真的很快),我这里说的是最新的iOS 界面设计规 ...
- RecyclerView实现终极画廊效果 中间突出并且压住两侧布局
先给大家上个gif 要不然下面很枯燥 忘记原来在哪里看到了..... 这个效果我找了NNNNNN长时间,,,我认为凭我现在的能力 写出来需要好久 所以 退而求其次找大神写好的... 你们不要小看了这个 ...
- date 格式化
以这个为例: yyyy-MM-dd HH:mm:ss 首先得写好你需要的模板 options.sign = options.sign || 'yyyy-MM-dd HH:mm:ss'; 其次就可 ...
- GEF入门笔记
最近项目中需要用到Eclipse GEF框架进行画图,故将平时学习笔记更新到博客中,便于查阅 自己画的一个GEF基本结构 最基本流程 1.创建model(包括数据域.在界面中的布局.图片索引等 ...
- jQuery访问json文件(一个例子)
保存网址 打开时 点开一个类型 当点开一个类型,其他类型隐藏 回到所有类型 没有错,左下角有个这是什么样子的图标 做到了什么: 1.从json文件中取得网址,并根据访问次数排列,放到前面: 2.就是1 ...
- POJ 2486 Apple Tree (树形dp 经典题)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...