Cprogramming 简明教程

Variadic Functions in C

变参函数是功能强大但很少使用的 features in C language 之一。变参函数为应用程序结构的编程增加了很大的灵活性。

Variadic Function in C

可以获取可变数量参数的函数称为变参函数。需要一个固定参数来定义变参函数。

C 语言中使用最频繁的库函数,即 printf()scanf() 实际上是变参函数最著名的示例,因为我们可以在格式说明符字符串后放置可变数量的参数。

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

Syntax of Variadic Functions

在 C 语言中,变参函数被定义为至少有一个固定参数,然后跟随一个省略号符号(…​),使编译器能够解析 variable number of arguments

return_type function_name(type arg1, ...);

你需要在代码的顶部包含 stdarg.h header file ,以处理可变参数。此头文件提供了以下宏,以便处理由省略号符号接收的参数。

Methods

Description

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 的末尾被触及时,列表对象会被清理。

Examples of Variadic Functions in C

Example: Sum of Numbers Using a Variadic Function

下面的代码利用可变函数的概念,对一个可变数量的数字参数求和,这些参数被传递到这样一个函数中。传递给 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() 函数提供一组不同的数字作为可变参数。

Example: Finding the Largest Number Using a Variadic Function

我们可以扩展可变函数的概念,以找到给定值列表中最大的数字。

#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

Example: Concatenation of Multiple Strings Using Variadic Function

在下面的代码中,我们将多个字符串传递给一个可变函数,该函数返回一个连接的字符串。

#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?