欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可变参数列表(模拟实现printf)

程序员文章站 2022-07-15 08:53:35
...

1.什么是可变参数列表?

通过将函数实现为可变参数的形式,可以使得函数可以接受1个以上的任意多个参数。

我们先看一个例子:

   

int average(int n,...)
{
	 va_list arg;           //相当于声明一个指针,名字为arg
	 int i = 0;
	 int sum = 0;
	 va_start(arg,n);          
	 for(i=0; i<n; i++)
	 {
		  sum += va_arg(arg,int);       //用一次后,va_arg指向下一个参数
	 }
	 return sum/n;
	 va_end(arg);
}
int main()
{ 
	 int avg1=average(3,1,2,0);
	 printf("%d",avg1);         //平均值,就可以求出来了,也可求最大值
	 return 0;
}

1.声明一个va_list  类型的变量arg ,它用于访问可变参数列表的未确定部分

2.va_start 用来初始化的,把arg变量设置为指向可变参数部分的第一个参数

3.va_arg 这个宏接受两个参数, va_list变量和参数列表中下一个参数的类型,并使他va_arg指向下一个可变参数。

4va_end ,使 arg指向空,毕竟arg为一个指针

5.printf就是通过可变参数列表写的

 下面是我自己模拟实现printf:

  #include<stdio.h>
   #include<stdarg.h>
   
  void my_print(int n)
  {
      if(n>9)
      {
          my_print(n/10);
       }
       putchar(n%10+'\0');
  }
  void print(char *format,...)
  {
        va_list arg;
      va_start(arg,format);
  
      while(*format)
  {
        switch(*format)
      {
           case 's':
                {
                 char * ret = va_arg(arg,char*);
                while(*ret)
                {
                    putchar(*ret);
                     ret++;
                 }
               }
                  break;
           case 'c':
                {
                char ch =va_arg(arg,int);
                  putchar(ch);
                }
                 break;
          case  'd':
                  {
                  int cur = va_arg(arg,int);
                  my_print(cur);
                  }
                break;
            default:
                  putchar(*format);
                break;
         }
           format++;
    }
  }
  int main()
  {
      print("s ccc d.\n","hello",'b','i','t',100);
      return 0;
  }