在C语言中,使用不定长度参数的正确姿势是什么?
先来看看下面代码中整理的三个函数,看看能不能看懂其中的作用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
/**
* [C语言] 不定长度参数。
*
* 常用的宏有:
* va_start(ap, last_arg):初始化可变参数列表。ap 是一个 va_list 类型的变量,last_arg 是最后一个固定参数的名称(也就是可变参数列表之前的参数)。该宏将 ap 指向可变参数列表中的第一个参数。
* va_arg(ap, type):获取可变参数列表中的下一个参数。ap 是一个 va_list 类型的变量,type 是下一个参数的类型。该宏返回类型为 type 的值,并将 ap 指向下一个参数。
* va_end(ap):结束可变参数列表的访问。ap 是一个 va_list 类型的变量。该宏将 ap 置为 NULL。
*
* 相关教程链接: https://www.runoob.com/cprogramming/c-variable-arguments.html 。
*/
double myAverage(int num, ...);
int myIntSum(int endLabelValue, ...);
void myFunction(char *arg1, ...);
int main(int argc, char **argv)
{
printf("Average of (2, 3, 4, 5) = %f\n", myAverage(4, 2, 3, 4, 5));
printf("Average of (5, 10, 15) = %f\n", myAverage(3, 5, 10, 15));
printf("Sum of (5, 10, 15) = %d\n", myIntSum(0, 3, 5, 10, 15, 0));
myFunction("%d,%s,%c", 12, "123", 'A');
return 0;
}
double myAverage(int num, ...)
{
// 定义一个参数指针。
va_list valist;
double sum = 0.0;
int i;
// 初始化可变参数列表。
va_start(valist, num);
// 访问所有赋给 valist 的参数。
for (i = 0; i < num; i++)
{
sum += va_arg(valist, int);
}
// 将 valist 指针置为NULL。
va_end(valist);
return sum/num;
}
int myIntSum(int endTagValue, ...)
{
// 定义一个参数指针。
va_list valist;
int result = 0;
int value;
// 初始化可变参数列表。
va_start(valist, endTagValue);
while((value = va_arg(valist, int)) != endTagValue) {
result += value;
}
// 将 valist 指针置为NULL。
va_end(valist);
return result;
}
void myFunction(char *fmt, ...)
{
// 定义一个参数指针。
va_list ap;
int d;
char c, *s;
// 初始化可变参数列表。
va_start(ap, fmt);
while (*fmt)
switch (*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
// 将 ap 指针置为NULL。
va_end(ap);
}
各位大牛还有别的正确姿势,欢迎留言告知。