可变参数列表解析

我们知道怎样用C语言编写求确定个数的参数的平均值,可是当我们不确定具体的参数个数时,应该怎么办呢?

一、首先,我们先来看一看main函数的原型:


其中,argc是整型变量,表示命令行参数的个数;

            argv是字符指针数组,每个元素指向一个字符串——命令行的每个参数

            envp是字符指针数组,每个元素是指向一个环境变量的字符指针。

下面,我们进行验证——修改命令参数,运行下面的代码,观察结果:


接下来进行 envp的验证:


二、可变参数列表解析

va_list是一个宏,由va_start和va_end界定,可以定义一个变量(如arg),用来访问参数列表的可变部分;

va_start用来初始化arg,第一个参数是va_list变量名(arg),第二个参数是省略号前的确定参数;

va_arg用来调用可变参数,第一个参数为va_list变量名(arg),第二个参数是数据类型;va_arg返回这个参数的值,并使用 va_arg```指向下一个可变参数;

va_end在调用完最后一个可变参数后使用。

//以下是一个例子(模拟实现printf):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdarg.h>
#include<Windows.h>


void print_10bit(int n)
{
if (n < 10)
{
putchar(n + '0');
}
else
{
print_10bit(n / 10);
putchar(n % 10 + '0');
}
}
int print(char *format, ...)
{
va_list arg;
va_start(arg, format);
while (*format != '\n')
{
if (*format == 's')
puts(va_arg(arg, char*));
else if (*format == 'c')
putchar(va_arg(arg, char));
else if (*format == 'd')
{
int tmp = va_arg(arg, int);
print_10bit(tmp);
}
else
putchar(*format);
format++;
}
va_end(arg);
return 0;
}
int main()
{
print("s ccc d.\n", "hello", 'b', 'i', 't', 100);
system("pause");
return 0;
}


可变参数的限制:

1)可变参数必须从头到尾逐个访问。如果你在访问了几个可变参数之后想半途终止,这是可以的,但是,如果你想一开始就访问参数列表中间的参数,那是不行的。
2)参数列表中至少有一个命名参数。如果连一个命名参数都没有,就无法使用
va_start
3)这些宏是无法直接判断实际存在参数的数量。
4)这些宏无法判断每个参数的是类型。
5)如果在
va_arg中指定了错误的类型,那么其后果是不可预测的。






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值