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

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;
  }

猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80421527