自己用C可变参数写个简单的printf函数

本文介绍了一个简单的自制printf函数实现过程,该函数通过fprintf输出到屏幕。文章详细解释了如何使用va_list、va_start、va_arg和va_end宏来处理可变参数,并针对不同数据类型进行了具体说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看C可变参数,想到自己写一个简单的printf函数,利用fprintf输出到屏幕上。

#include <stdio.h>
#include <stdarg.h>

int print(char const * fmt, ...)
{
	va_list vp;
	va_start(vp, fmt); 
	while(*fmt != '\0')
	{
		if(*fmt != '%')
			fprintf(stdout, "%c", *fmt);
		else{
			switch(*++fmt)
			{
				case 'd': 
					fprintf(stdout, "%d", (int)va_arg(vp, int));
					break;
				case 'f':
					fprintf(stdout, "%f", (double)va_arg(vp, double));
					break;
				case 'c':
					fprintf(stdout, "%c", (int)va_arg(vp, int));
					break;
				case 's':
					fprintf(stdout, "%s", (char *)va_arg(vp, char*));
					break;
				default:
					fprintf(stderr, "error!");
			}
		}
		++fmt;
	}
	va_end(vp);
} 

int main()
{
	int i = 10;
	float f = 10.123;
	char *str = "hello world!";
	char ch = 'a';
	print("%d %s %c %f\n", i, str, ch, f);
	return 0;
}

需要说明的是:

1)从参数列表中读取一个float类型的参数时,要是使用:

(double)va_arg(vp, double)
使用(float)va_arg(vp, float)时出错。

2)读取一个字符型参数时,要使用:

(int)va_arg(vp, int);

因为涉及到存储时的对齐,使用(char)va_arg(vp, char)时,会使参数列表错乱。

3)当使用(char *)va_arg(vp, char*)时,读取的是一个完整的字符串,也就是读到一个字符串结束符为止。

4)关于使用到的几个宏,va_list, va_start, va_arg, va_end等的具体细节及编译时的工作原理,

我参考了:http://pcedu.pconline.com.cn/empolder/gj/c/0507/669879_all.html 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值