/*************************************************************************
> 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 语言函数可变參数的处理的更多相关文章

  1. C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数

    在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...

  2. OC可变參数的函数实现va_start、va_end、va_list的使用

    一.简单介绍 我们常常在编程的时候看见类似这种代码,如图1.1 图1.1 或者是这种可变參数,如图1.2 图1.2 二.基本知识介绍 在学习怎样写这样的格式的函数前,先简介几个经常使用的宏: 下面摘自 ...

  3. python可变參数调用函数问题

    一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...

  4. Effective JavaScript Item 22 使用arguments来创建接受可变參数列表的函数

    本系列作为Effective JavaScript的读书笔记. 在Item 21中,介绍了结合apply方法实现的可变參数列表函数average,它实际上仅仅声明了一个数组作为參数,可是利用apply ...

  5. Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表

    本系列作为Effective JavaScript的读书笔记. 以下是一个拥有可变參数列表的方法的典型样例: average(1, 2, 3); // 2 average(1); // 1 avera ...

  6. 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)

    各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...

  7. C语言变长參数的认识以及宏实现

    1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为con ...

  8. C语言中main函数的參数具体解释

    main函数的定义形式         main函数能够不带參数,也能够带參数,这个參数能够觉得是 main函数的形式參数.C语言规定main函数的參数仅仅能有两个,习惯上这两个參数写为argc和ar ...

  9. Printf可变參数使用

    參考文档: http://bbs.csdn.net/topics/70288067 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 本文的二 ...

随机推荐

  1. [HTML&CSS] 条件注释判断浏览器

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...

  2. Android源代码分支、版本号、支持设备列表

    Build Branch Version Supported devicesOPD3.170816.023 android-8.0.0_r34 Oreo Pixel 2 XL, Pixel 2OPD1 ...

  3. Unity3d 刚体

    using UnityEngine; using System.Collections; public class rigidbody_ : MonoBehaviour { private Rigid ...

  4. css3中的animation属性

    作用:通过给元素添加animation属性,可以赋予该元素动画效果. <!DOCTYPE html><html>    <head>        <styl ...

  5. 纯CSS3文字Loading动画特效

    纯CSS3文字Loading动画特效是一款个性的loading文字加载动画. 在线演示本地下载

  6. hdu3938 Portal 离线的并查集

    离线算法是将全部输入都读入,计算出所有的答案以后再输出的方法.主要是为避免重复计算.类似于计算斐波那契数列的时候用打表的方法. 题目:给一个无向图,求有多少个点对,使得两点间的路径上的花费小于L,这里 ...

  7. 读书笔记6-浪潮之巅(part1)

    浪潮之巅 ——对于一个人来讲,一生能够赶上一次科技革命的浪潮也就足够了 近一百多年来,总有一些公司很幸运地站在了技术革命的浪尖上.而一旦处在那个位置,就算只用随着潮流的发展而前行,也能安安稳稳地发展十 ...

  8. [翻译]内存一致性模型 --- memory consistency model

    I will just give the analogy with which I understand memory consistency models (or memory models, fo ...

  9. 【原创】打印GC log

    -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:c:/gc.log

  10. oc的属性

    Declared property A declared property provides a syntactical shorthand for declaring a class’s acces ...