程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學點C語言(40):函數 - 多參函數

學點C語言(40):函數 - 多參函數

編輯:關於C語言

像 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語言 - 目錄”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved