自己动手用C语言实现迷你printf函数

本文详细介绍了如何自己动手实现C语言中的迷你printf函数,包括可变参数函数的原理和使用,以及%d、%x格式化输出的实现。通过解析格式化字符串,将整型数值转换为十进制和16进制字符串,并提供了转换规律和具体代码示例。最后,文章展示了迷你printf函数的整体实现代码,适合深入理解printf函数的工作机制。
摘要由CSDN通过智能技术生成

可变参数函数简单解读(variadic function)

平时写代码接触最多函数大概就是 printf 函数了,printf 函数就是一个可变参数函数,第2个参数就是可变参数,第一个参数是格式化字符串。格式化字符串中的转换修饰符决定了可变参数的数量和类型。

int printf (const char *format, ...)

可变参数函数(variadic function):函数参数变量可变的函数。可变参函数包括至少一个强制参数(mandatory argument)+数量可变的可选参数(optional argument),强制性参数在前,可变参数用省略号(…)表示。
实现可变参数函数需要包含**<stdarg.h>**头文件,他提供需要用到的下列宏定义:

 typedef char* va_list;
 void va_start(va_list argptr, lastparam);
 type va_arg(va_list argptr, type);
 void va_end(va_list argptr);
 void va_copy(va_list dest, va_list src);
  • typedef char va_list;*:简单理解就是指向就是存放可变参数列表的指针,访问这个列表可以得到每一个可变参数。

第一步:定义函数,并用这个类型定义一个变量:

int m_printf(const char *f_str,...)
{
   
	va_list p_list;
}
  • void va_start(va_list argptr, lastparam);:第一个参数为va_list类型的变量,第2个参数为可变参的数量。此函数会做可变参数链表的初始化等工作。

第2步:用va_start初始化 p_list变量。format为printf函数的第一个参数。

int m_printf(const char *f_str,...)
{
   
	va_list p_list;
	
	va_start(p_list,f_str);
}
  • type va_arg(va_list argptr, type);:第一个参数为va_list类型的变量,第2个参数为可变参数的类型。此函数会按照从左到右的顺序从可变参数列表里面pop出一项可变参数的值,然后p_list指针会指向下一个可变参数。

第3步:用va_arg获取可变参参数的值。根据参数类型,type需要设置为不同的类型。

int m_printf(const char *f_str,...)
{
   
	va_list p_list;
	int value;
	char* chs;
	
	va_start(p_list,f_str);
	... ...
	/* pop出一个int类型的值 */
	value = va_arg(p_args,int);
	/* pop出一个字符串 */
	chs = va_arg(p_args,char*);
}
  • void va_end(va_list argptr);:参数列表指针不需要被使用的时候需要调用此函数完成清理等工作。

最后一步调用va_end完成清理工作。

int m_printf(const char *f_str,...)
{
   
	va_list p_list;
	int value;
	char* chs;
	
	va_start(p_list,f_str);
	... ...
	/* pop出一个int类型的值 */
	value = va_arg(p_args,int);
	/* pop出一个字符串 */
	chs = va_arg(p_args,char*);
	... ...
	va_end(p_args);
}
  • 下面是一个简单的可变参数函数add()的实现代码:
/* num:表示可变参数的数量 */
int add(int num,...)
{
   
    int sum,i;
    va_list p_list;
    int value;
    sum = 0;

    va_start(p_list
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值