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

来源:互联网 发布:知乎乌金木和赤金檀木 编辑:程序博客网 时间:2024/06/04 00:39

      在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中指定了错误的类型,那么后果是不可预测的。

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