C語言中的變參函式



變參函式是C語言中強大但很少使用的特性之一。變參函式在程式設計應用程式結構方面增加了很大的靈活性。

C語言中的變參函式

可以接受可變數量引數的函式稱為變參函式。定義變參函式需要一個固定引數。

C語言中最常用的庫函式,即printf()scanf()實際上是變參函式最著名的例子,因為我們可以在格式說明符字串之後放置可變數量的引數。

 
printf("format specifier",arg1, arg2, arg3, . . .); 

變參函式的語法

在C語言中,變參函式被定義為至少有一個固定引數,然後後跟省略號(...),這使得編譯器能夠解析可變數量的引數

return_type function_name(type arg1, ...);

您需要在程式碼頂部包含stdarg.h標頭檔案來處理可變引數。此標頭檔案提供以下宏來處理省略號符號接收到的引數。

方法 描述
va_start(va_list ap, arg) 最後一個固定引數後的引數儲存在va_list中。
va_arg(va_list ap, type) 每次獲取可變引數列表va_list中的下一個引數,並將其轉換為給定的型別,直到到達列表的末尾。
va_copy(va_list dest, va_list src) 這會建立va_list中引數的副本。
va_end(va_list ap) 這將結束對變參函式引數的遍歷。當到達va_list的末尾時,列表物件將被清理。

C語言中變參函式的示例

示例:使用變參函式求數字之和

以下程式碼使用變參函式的概念來返回傳遞給此函式的可變數量的數字引數的總和。addition()函式的第一個引數是其餘引數的數量。

在addition()函式內部,我們如下初始化va_list變數:

va_list args;
va_start (args, n);

由於後面有“n”個引數,因此使用“va_arg()”宏獲取“n”次的下一個引數並執行累加:

for(i = 0; i < n; i++){    
   sum += va_arg (args, int);    
}

最後,清理va_list變數:

va_end (args);

函式透過返回所有引數的總和結束。

完整的程式碼如下:

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

// Variadic function to add numbers

int addition(int n, ...){

   va_list args;
   int i, sum = 0;

   va_start (args, n);  
  
   for (i = 0; i < n; i++){    
      sum += va_arg (args, int);    
   }

   va_end (args);    
  
   return sum;
}

int main(){

   printf("Sum = %d ", addition(5, 1, 2, 3, 4, 5));
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

Sum = 15

您可以嘗試向addition()函式提供不同的數字集作為變參。

示例:使用變參函式查詢最大數

我們可以擴充套件變參函式的概念來查詢給定可變數量值的列表中的最大數。

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

// Variadic function to add numbers
int largest(int n, ...){
   va_list args;
   int i, max = 0;

   va_start (args, n);

   for(i = 0; i < n; i++){
      int x = va_arg (args, int);
         if (x >= max)
            max = x;
   }

   va_end (args);
   return max;
}

int main(){

   printf("Largest number in the list = %d ", largest(5, 12, 34, 21, 45, 32));

   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Largest number in the list = 45

示例:使用變參函式連線多個字串

在以下程式碼中,我們將多個字串傳遞給一個變參函式,該函式返回一個連線後的字串。

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

char * concat(int n, ...){
   va_list args;
   int i;
   static char string[100], *word;

   va_start (args, n);
   strcpy(string, "");
  
   for (i = 0; i < n; i++){
      word= va_arg (args, char *);
      strcat(string, word);
      strcat(string, " ");
   }

   va_end (args);

   return string;
}

int main(){

   char * string1 = concat(2, "Hello", "World");
   printf("%s\n", string1);
   char * string2 = concat(3, "How", "are", "you?");
   printf("%s\n", string2);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

Hello World
How are you?
廣告