可变参数问题(以及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;
}
例如:
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;
}
相关文章推荐
- 可变参数问题以及实现简单的myprintf
- 使用varargh.h来实现可变参数列表以及varargh.h实现
- 可变参数列表的剖析以及printf函数的实现
- 在js中如何实现方法重载?以及函数的参数问题
- c语言可变参数原理以及printf函数的自实现
- Java方法传参和可变参数的个别说明,以及foreach的语法和编译后的实现
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- js中方法重载如何实现?以及函数的参数问题
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- struts2重定向时传递参数的实现!以及传递参数为中文时的乱码问题解决!
- js中方法重载如何实现?以及函数的参数问题
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- 可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱
- 可变参数的解释以及实例printf的实现
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
- [置顶] 在js中如何实现方法重载?以及函数的参数问题
- C语言之可变参数问题
- url重写实现任意二级域名或多级域名(修正参数中断问题)
- 实现可变参数个数的函数
- url重写实现任意二级域名或多级域名(修正参数中断问题)