2013-04-29 73 views
2

我正在編寫一個方法,它接受一個數字n和n個整數(一個變量數),並且此函數將返回不包含n的整數的總和。我被困在如何單獨訪問每個參數。這是我迄今爲止所做的,我在網上閱讀了它,希望我能夠走上正軌。 方法似乎在網絡上發現有用的是:C中的參數變量

va_start() 
va_arg() 
va_end() 


int sumv(int n, ...) 
{ 
    va_list list; 
    int sum = 0; 
    while(n>0) 
    { 
    //********************* 
    //this is the part where I am stuck on, how do I get each paramater? 
    //I know it will be an int 
    //********************* 
    n--; 
    } 
    return sum; 
} 
+1

我建議你閱讀[bobobobo的「如何使用va_list」的帖子](http://bobobobo.wordpress.com/2008/01/28/how-to-use-variable-argument-lists-va_list/) – bobobobo 2013-04-29 03:29:59

+1

Hoorrah!對於自我推銷:D ... lol:P ..其實很不錯:D – 2013-04-29 04:12:03

回答

5

它應該是這個樣子:

int sumv(int n, ...) 
{ 
    va_list list; 
    va_start(list, n); 
    int sum = 0; 
    while(n>0) 
    { 
    sum += va_arg(list, int); 
    n--; 
    } 
    va_end(list); 
    return sum; 
} 
+0

因此,當我打電話給va_arg(list,int)時,它會進入下一個爭論?非常有趣 – 2013-04-29 03:25:02

+0

@JamesCarter:是的(提供的下一個項目是int,無論如何 - 第二個參數是要檢索的參數的類型)。 – 2013-04-29 03:46:05

0

你基本上在尋找這樣的:

#include <stdio.h> 
#include <stdarg.h> 

int sumv (int n, ...) { 
    va_list list; 

    int sum = 0; 

    va_start (list, n); 
    while (n-- > 0) 
     sum += va_arg (list, int); 
    va_end (list); 

    return sum; 
} 

int main (void) { 
    printf ("%d\n", sumv (5, 1, 2, 3, 4, 5)); 
    return 0; 
} 

這打印前五個自然數的總和,即15

基本思想是va_start,在變量參數開始之前給函數列表和函數中的最後一個參數。

然後,每次撥打va_arg都會給您指定類型的下一個參數(此處爲int)。這個特定的代碼根據你的計數器調用它,但是你可以在末尾同樣使用一個哨兵值,例如負數,前提是負數在參數中是無效的。

然後,一旦處理完所有參數,就使用va_end來終止處理。