模拟实现printf函数,完成函数调用

通过函数原型可以看出printf函数其实是一个可变参数函数,在printf函数中只需要知道传入函数的第一个参数,就可以根据该参数在栈中的存储位置获取后面参数的位置及信息了。

printf函数第一个参数const cahr *format,该字符串内包含并确定了后面参数的输出格式,比如"%c","%d","%d","%x"等等。

printf函数返回值,就是通过该函数打印到标准输出流(屏幕)的字符串,出错的话就返回一个负数。

下面自己模拟一下printf函数来感受感受。

基本思路是:利用传入的第一个参数,也就是字符串。通过对字符串的遍历,若该字符为‘%’,则对它后面的字符进行判断是否是规范化输出要求的字符(比如'c','d','s',‘f’'等等),然后利用va_arg(ap,t);获取后面参数中参数所对应的信息,并输出;若不为'%',则输出该字符。同时在上述两种情况下,都需要对所打印的字符个数进行统计(包括输出数值所对应的数字的个数)。

#include <stdio.h>
#include <windows.h>  
#include <assert.h>   
int myprintf(const char *format, ...)
{
	assert(format);
	va_list arg;
	va_start(arg, format);
	while (*format)
	{
		if (*format == '%')
		{
			format++;
			switch (*format)
			{
			case's':
			{
				char *s = va_arg(arg,char*);
				while (*s)
				{
					puts(s);
				}
			}
					break;
			case'c':
			{
				char c = va_arg(arg, char);
				putchar(c);
			}
				break;
			case'%':
			{
				putchar('%');
			}
				break;
			default:
				puts("format error!\n");
				return ;
			}
		}
		else if (*format == '\\')
		{
		}
		else
		{
			putchar(*format);
		}
		format++;
	}
	va_end(arg);
	return 0;
}
int main()
{
	char c = 'c';
	char *s = "hello word";
    myprintf("hello %c,hello %s\n", c, s);
	system("pause");
	return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值