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> // 用于添加数字的可变函数 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> // 用于加法运算的可变函数 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 ", string1); char * string2 = concat(3, "How", "are", "you?"); printf("%s ", string2); return 0; }
输出
运行代码并检查其输出 −
Hello World How are you?