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

来源:互联网 发布:淘宝买的京东e卡能退吗 编辑:程序博客网 时间:2024/05/24 05:02

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

原创粉丝点击