【C语言】模拟实现printf函数(可变参数)

时间:2023-02-11 14:23:44

一、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下,我们转到定义出,可以清晰发现这些宏的定义:

【C语言】模拟实现printf函数(可变参数)

【C语言】模拟实现printf函数(可变参数)

分析

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

运行结果:

【C语言】模拟实现printf函数(可变参数)