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 转载请标明来源 本文的二 ...
随机推荐
- JS轮播图动态渲染四种方法
一. 获取轮播图数据 ajax 二.根据数据动态渲染 (根据当前设备 屏幕宽度判断) 1. 准备数据 2. 把数据转换成html格式的字符串 动态创建元素 字符串拼接 模板引擎 框架方法 2.把字符 ...
- Python基本数据类型之数字int
数字 int(x, base=None) 将x转换为一个整数.base为按照多少进制进行转换 float(x) 将x转换到一个浮点数. complex(x) 将x转换到一个复数,实数部分为 x,虚数部 ...
- Codeforces Round #198 (Div. 2)C,D题解
接着是C,D的题解 C. Tourist Problem Iahub is a big fan of tourists. He wants to become a tourist himself, s ...
- JavaScript——视频插入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 文档控件NTKO OFFICE 详细使用说明之预览PDF文件(禁止打印、下载、另存为、防抓包下载)
1.在线预览PDF文件(禁止打印.下载.复制.另存为) (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将ww ...
- webpack打包css自动添加css3前缀
为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...
- 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~
在移动端 H5 页面开发中,我使用了 fixed 固定某个元素在屏幕的最下方, 这时点击输入框,接着非常非常自然地出现了元素被系统键盘顶起来的情况,如下图. 解决方案: 首先,给页面最外层包裹一层 d ...
- 前端-JQ思维导图
看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记
- JavaScript私有方法
some concepts: Java is from Sun Microsystem Inc., and JavaScript, called LiveScript before, is from ...
- 关于table排版
colspan和rowspan这两个属性用于创建特殊的表格. colspan是“column span(跨列)”的缩写.colspan属性用在td标签中,用来指定单元格横向跨越的列数: 在浏览器中 ...