1. 程式人生 > >c 語言函數可變參數的處理

c 語言函數可變參數的處理

格式 n+1 c語言 功能 全部 進行 print content created

/*************************************************************************
    > 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 語言函數可變參數的處理