Cprogramming 简明教程
Variadic Functions in C
变参函数是功能强大但很少使用的 features in C language 之一。变参函数为应用程序结构的编程增加了很大的灵活性。
Variadic Function in C
可以获取可变数量参数的函数称为变参函数。需要一个固定参数来定义变参函数。
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?