#include <stdarg.h>//可变参数头文件
例如:
1.int Max_list(int a,...)//参数有好多怎么办?
{
va_list list;
int max = a;
int cur = a;
va_start(list,a);//没关系,指针来解决;打开指针,list是指向下一个参数的指针,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;
}
}
{
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 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)//??打印浮点数字,这个暂时不会
//{
//
//}
{
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;
}
{
MyPrint("adfsadf%d%d%c%s\n",123456,10,'x',"abcd");
return 0;
}