簡體   English   中英

可變參數加法函數C

[英]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_startva_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM