根据printf函数来讲解可变参数

      在C语言中常用printf函数输出各种类型的数值,而且输出的参数可多可少,这就涉及到了可变参数函数的定义。

    在此模拟实现printf函数,可完成下面的功能,能完成下面函数的调用。 print("s ccc d.\n","hello",'b','i','t',100); 函数原型: print(char *format, ...) 

     代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include<stdarg.h>


void print(char *tmp, ...)   //实现可变形参

{

va_list arg;     //声明va_list类型的变量arg,用于访问参数列表的未确定部分

va_start(arg, tmp);    //调用va_start来初始化。它的第一个参数是va_list的变量名,第2个参数是省略号前最后一个有名字的参数。初始化过程把arg变量设置为指向可变参数部分的第一个参数。

while (*tmp != '\0')

{

if (*tmp == 'c')

{

putchar(va_arg(arg, char ));  //定义va_arg来访问参数,这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。

}

else if (*tmp == 's')

{

puts(va_arg(arg, char *));

}

else if (*tmp == 'd')

{

int d = va_arg(arg, int);

printf("%d", d);

}

tmp++;

}

va_end(arg);     //最后,当访问完最后一个可变参数之后,我们需要调用va_end。

}

 

int main()

{

int a = 1;

int b = 2;

int c = 3;

print("sccc d\n", "hello", 'b', 'i', 't',100);

getchar();

system("pause");

    return 0;  

}  

但是,可变参数会有一些限制,例如:

  1.可变参数必须从头到尾逐个访问。如果你在访问几个参数之后想要终止,这是可以的,但是,如果你要访问中间的参数,那是不行的。

  2.可变参数中至少有一个命名参数。如果连一个命名参数都没有,就无法使用va_start。

  3.这些宏无法判断每个参数的类型。

  4.这些宏无法直接判断实际存在参数的数量。

  5.如果在va_arg中指定了错误的类型,那么后果是不可预测的。

希望这些对大家有所帮助。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值