一、printf函数介绍
printf功能
printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。
printf原型
int printf( const char* format , [argument] ... ); //定义在stdio.h中
以上部分来自于高小调博客(一个UI非常好,没有广告,纯绿色的博客,建议大家收藏)
二、利用可变参数列表模拟实现printf
1.分析printf函数
printf("Hello haohaosong!\n");
printf("%s","Welcome to my bolg\n");
printf("hell%c\n",'o');
我们发现,printf函数的参数是不确定的
传参的地方必须使用其他东西
2.解决方法
利用stdarg宏来解决可变参数问题
头文件:<stdarg.h>
va_list;
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr, prev_param ); (ANSI version)
在VC6.0下,我们转到定义出,可以清晰发现这些宏的定义:
分析
va_list 是用宏定义的标识符,是指向字符类型的指针
va_start(ap,v) 取出va_list 定义的变量的地址,并加上可变元素的数目
va_arg(ap,t) 每次取指针指向的内容,并在宏的内部将指针后移
va_end(ap) 将原指针指向空,以防止野指针的出现
三、具体代码
代码块:
#include<stdio.h>
#include<stdarg.h>
int my_printf(char* str,...)
{
va_list arg;//定义char* 变量 arg
int count = 0;
char* str_tmp = NULL;
va_start(arg,str);//为arg进行初始化
while(*str != '\0')
{
switch(*str)
{
case 'c':
putchar(va_arg(arg,int));//取下一个参数的字符,并打印
count++;
break;
case 's':
str_tmp = (char*)va_arg(arg,int);//取下一个参数的地址,因为这个是字符串
while(*str_tmp != '\0')//利用解引用进行输出
{
putchar(*str_tmp);
count++;
str_tmp++;
}
break;
default:
putchar(*str); //不为'c'或's',那么直接将它打印
count++;
break;
}
str++;
}
va_end(arg);//将arg指向空,防止野指针
return count;
}
int main()
{
my_printf("s ccc","hello",'H','h','s');
return 0;
}