2017-09-15 26 views
-1

我試圖做一個程序使用變量參數功能傳遞scanf函數項stdarg頭文件功能

average(int numberOfValues, ...); 

當條目值的數量來獲得平均和值,做N個數的平均值本身(...)。

問題是:我可以做一個例程來從scanf中獲取這些值嗎?我想用numberOfValues大小構建一個數組,然後調用vararg函數,但是我不能爲一個函數傳遞一個數組(至少沒有指針)。我是否在回答問題?我也想過把numberOfValues和values作爲主函數參數(至少爲了測試)來解決這個問題。

+2

我想你有一個[The XY Problem](http://xyproblem.info)的實例。請注意,如果您在調用'average()'之前不知道值的數量,那麼可變參數函數沒有多大意義。如果你想使用'scanf()'計算數字的平均值,直接計算總和並計算值的數量。如果您知道如何編寫變量參數函數,則不會使用'scanf()'。 –

回答

2

你當然可以這樣做

int a, b, c; 
scanf("%d%d%d", &a, &b, &c); 
average(3, a, b, c); 

也許

int a[3]; 
scanf("%d%d%d", &a[0], &a[1], &a[2]); 
average(3, a[0], a[1], a[2]); 

但是,如果你不知道(直到用戶鍵入他們)有多少值會有,那麼,你可能想要將它們存儲在一個數組中,但是,不可用可變參數函數來計算平均值並不會有用。

可變參數函數的一個限制(傳統的函數,至少)是在編譯時必須總是知道參數的數目(對於某個特定的調用)。

所以,相反,你可能會想要寫

average(int numberOfValues, int theValues[]) 
{ 
    /* ... */ 
} 

,你值傳遞作爲數組,而不是作爲一個變量參數列表。這可能會更容易編寫,並且更通用。

+1

我不會說這是一個限制。運行時可變參數根本沒有意義。 –

+1

@IharobAlAsimi好吧,它可能不是「傳統」可變參數使用的限制,但相信我,有很多人希望在運行時構造可變長度的參數列表。 (這就是我所說的「反向可變參數問題」。) –