1. 程式人生 > >可變引數列表(模擬實現printf)

可變引數列表(模擬實現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;
  }