您的位置:首页 > 其它

可变参数问题(以及Myprintf函数的实现)

2017-10-08 16:53 232 查看
#include <stdarg.h>//可变参数头文件

例如:

1.int Max_list(int a,...)//参数有好多怎么办?

{

 va_list list;

 int max = a;

 int cur = a;

 va_start(list,a);//没关系,指针来解决;打开指针,list是指向下一个参数的指针,a是第一个参数的指针

 while(cur >=0 )

 {

  cur = va_arg(list,int);//使用指针,list会自动指向下一个参数,int是指针指向参数的类型

  if(max < cur)

  {

   max = cur;

  }

 }

 va_end(list);//关闭指针

 return max;

}

2.返回最大值

int max_list(int n,...)

{

 va_list list;

 va_start(list,n);

 int max = 0;

 int num;

 for(int i = 0;i<n;i++)

 {

  num = va_arg(list,int);

  if(num>max)

  {

   max = num;

  }

     if(num<0)

     {

      break;

     }

 }

va_end(list);

return max;

}

int main()

{

 printf("%d\n",max_list(6,1,2,3,4,5,-1));

 return 0;

}

3.Myprintf()
void printstr(char *str)//打印字符串

{

 while(*str != '\0')

 {

  putchar(*str);

     str++;

 }

}

void printint(int n)//打印整型数字

{

 int i = 0;

 char str[100];

 if(n == 0)

  putchar('0');

 else

  while(n)

  {

   str[i] = (n%10)+'0';

   n/=10;

   i++;

  }

  i--;

  while(i>=0)

  {

   putchar(str[i]);

   i--;

  }

}

//int printfloat(float n)//??打印浮点数字,这个暂时不会

//{

//

//} 

void MyPrint(const char *str,...)//用到了可变参数

{//d,c,s,f

 va_list list;

 char ch;

 int num;

 float n;

 

 va_start(list,str);//list是指向下一个参数的指针,str是第一个参数的指针

 

 while(*str != '\0')

 {

  if(*str == '%')

  {

   switch(*(str+1))

   {

   case 'd':

    {

    num = va_arg(list,int);

    //printf("%d",num);//todo,不使用printf

    char *arr = "";

    printint(num);

    str += 2;

    break;

    }

   case 'c':

    {

    ch = va_arg(list,char);

    putchar(ch);

    str += 2;

    break;

    }

   case 'f'://todo

    {

    n = va_arg(list,float);

    printfloat(n);

    str += 2;

    break;

    }

   case 's'://todo

    {

    char *str0 = va_arg(list,char*);//原型:type va_arg(va_list arg_ptr,type);

              //功能:获取下一个参数的地址

           // 返回值:根据传入参数类型决定返回值类型

    printstr(str0);

    str += 2;

    break;

    }

   default:

    {

    putchar(*str);

    break;

    }

   }

  }

  else

  {

   putchar(*str);

   str++;

  } 

 }

 va_end(list);

}

int main()

{

 MyPrint("adfsadf%d%d%c%s\n",123456,10,'x',"abcd");

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多参数