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?
广告