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

來源:互聯網
上載者:User
像 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;}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.