像 printf 這種多參函數,是借用 stdarg.h 中的宏實現的.
va_list : 用於定義遍歷參數列表的指針;
va_start : 讓指針指向第一個參數;
va_arg : 獲取下一個參數,並向後移動一個位置;
va_end : 釋放指針,完成遍歷.
1. 整數求和:
本例實現了對系列整數求和,要求至少要有三個參數,並且最後一個必須是 0.
最後的 0 用於識別列表結束.
#include <stdio.h>
#include <stdarg.h>
int sum(int n1,int n2,...)
{
/* 定義一個指向參數列表的指針,必須是 va_list 類型 */
va_list p;
/* 定義輸出變量,並先獲取前兩個值 */
int out = n1 + n2;
/* 把指針指向最後一個明確的變量 */
va_start(p,n2);
/* 用 va_arg 獲取下一個整數值,va_arg 會同時把指針向後移動整數大小的位置 */
/* 本例是假定參數都是整數值,遇 0 終止; 這樣在使用是最後一個參數必須是 0 */
while ((n2 = va_arg(p,int)) != 0) out += n2;
/* 結束 */
va_end(p);
return(out);
}
int main(void)
{
printf("%d\n",sum(2,2,2,0)); /* 6 */
printf("%d\n",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
getchar();
return 0;
}
2. 整數求和(修改版):
這個函數要求至少要兩個參數,最後必須是 0.
#include <stdio.h>
#include <stdarg.h>
int sum(int n1,...)
{
va_list p;
int out = n1;
va_start(p,n1);
while ((n1 = va_arg(p,int)) != 0) out += n1;
va_end(p);
return(out);
}
int main(void)
{
printf("%d\n",sum(2,0)); /* 2 */
printf("%d\n",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
getchar();
return 0;
}
3. 指定數目的浮點數求和:
該函數參數一指定數目,之後是列表.
#include <stdio.h>
#include <stdarg.h>
double sum(int num,double f1,...)
{
va_list p;
double out = f1;
va_start(p,f1);
while(--num)
{
f1 = va_arg(p,double);
out += f1;
}
va_end(p);
return(out);
}
int main(void)
{
printf("%g\n",sum(3,1.1,2.2,3.3)); /* 6.6 */
printf("%g\n",sum(2,1.1,2.2,3.3)); /* 3.3 */
getchar();
return 0;
}
4. 整數與浮點數求和:
本例模擬了 printf 函數的樣式,但只支持整數與浮點數.
#include <stdio.h>
#include <stdarg.h>
double sum(char *str,...)
{
va_list List;
double out = 0.0;
va_start(List,str);
while (*str)
{
if (*str == '%')
{
switch (*(++str)) {
case 'd': out += va_arg(List,int); break;
case 'f': out += va_arg(List,double); break;
}
}
str++;
}
va_end(List);
return(out);
}
int main(void)
{
double d = sum("%d,%f,%d,%f",1,1.1,2,2.2);
printf("%g\n",d); /* 6.3 */
getchar();
return 0;
}
返回“學點C語言 - 目錄”