[英]Variadic Adding Function C
我正在編寫一個簡單的可變參數函數,該函數將一系列整數相加並返回總和。 我在理解它的工作方式時遇到了一些麻煩,盡管我覺得我的代碼方向正確,但我的代碼似乎沒有工作。 (在下面發布)此函數的規范是,它至少需要一個參數,而最后一個參數始終為零(如在主體中所看到的)。 我還被告知,基於我的機器,我不一定會得到我正在尋找的輸出,正如您可以想象的那樣,這會使我的情況更加復雜。 在糾正我的Sum()函數方面的一些幫助將不勝感激。
編輯:這應該是通過不使用stdarg.h標頭完成的,因此沒有va_arg函數。
int Sum(int a, ... ) {
int sum = 0, *addy = &a;
while (*addy) {
sum += *addy;
addy += sizeof(a);
}
return sum;
}
int main() {
printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}
//Expected output: 0 21 55 -19
//My output: 0 32770 32770 32776
當您向int指針添加數字時(如addy += sizeof(a)
),您添加的數字會自動乘以該指針聲明為的任何類型的大小(在本例中為int
)。 要解決此問題,只需使用
addy += 1;
代替。 但是,我建議您使用可變參數宏而不是此方法,因為它們更加清晰且不易出錯。
對於變量參數,必須使用va_start
和va_end
函數,希望有用。
http://www.gnu.org/software/libc/manual/html_node/Variadic-Example.html#Variadic-Example
你能檢查一下嗎
int Sum(int a, ... ) {
int sum = 0, *addy = &a;
while (*addy) {
sum += *addy;
addy ++;
}
return sum;
}
int main() {
printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}
要記住的一點是指針操作:要添加到指針的數字將乘以指針所指向的類型的大小。 因此,遞增指針addy足以獲取下一個元素。
#include <stdarg.h>
#include <stdio.h>
int
add_em_up (int count,...)
{
va_list ap;
int i, sum;
va_start (ap, count); /* Initialize the argument list. */
sum = 0;
for (i = 0; i < count; i++)
sum += va_arg (ap, int); /* Get the next argument value. */
va_end (ap); /* Clean up. */
return sum;
}
int
main (void)
{
/* This call prints 16. */
printf ("%d\n", add_em_up (3, 5, 5, 6));
/* This call prints 55. */
printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.