/*************************************************************************
> File Name: va_list.c
> Author: zshh0604
> Mail: [email protected]
> 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: [email protected]
> 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 語言函數可變參數的處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.