不使用man 3 printf的函数,实现一个简单的printf函数

题目:不使用man printf中的函数,实现一个简易的输出函数myprintf。
函数声明:int myprintf(const char *format,...);
要求该函数可以识别(只需要识别)出format字符串中的%ld,%lf,%c,%s这四个转义字符,并转化成相应的参数。

说明:man printf中的函数即:printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf


实现代码:

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

//输出一段普通的字符串
int PrintStr(const char *format)
{
	const char *pos = format;
	int len = 0;
	while( *pos )
	{
		putchar( (int)*(pos++) );
		len++;
	}
	return len;
}

int MyPrintf(const char *format, ...)
{
	const char *pos = format;
	int len, sublen;
	len = 0;
	va_list vlist;
	va_start(vlist, format);

	while( *pos )
	{
		char ch = *pos;
		if( ch != '%' )
		{
			putchar( ch );
			sublen = 1;
			pos++;
		}
		//处理转义字符
		else
		{
			char nch = *(pos+1);
			//处理单字符转义
			if( 'c' == nch )
			{
				char tch = va_arg(vlist, char);
				putchar(tch);
				pos += 2;
				sublen = 1;
			}
			//处理字符串转义
			else if( 's' == nch )
			{
				char *tstr = va_arg(vlist, char*);
				sublen = PrintStr(tstr);
				pos += 2;
			}
			else if( 'l' == nch )
			{
				char nnch = *(pos + 2);
				//处理整形数据转义
				if( 'd' == nnch )
				{
					long tnum = va_arg(vlist, long);
					char tstr[21];
					_ltoa(tnum, tstr, 10);
					sublen = PrintStr(tstr);
					pos += 3;
				}
				//处理浮点形数据转义
				else if( 'f' == nnch )
				{
					double tnum = va_arg(vlist, double);
					char tstr[101];
					gcvt(tnum, 10, tstr);
					sublen = PrintStr(tstr);
					pos += 3;
				}
				else
				{
					putchar('l');
					putchar(nnch);
					pos += 3;
				}


			}
			//处理两个%的情况
			else if( '%' == nch )
			{
				putchar('%');
				pos += 2;
				sublen = 1;
			}
			else
			{
				pos++;
				sublen = 0;
			}
		}
		
		len += sublen;
	}
	va_end(vlist);

	return len;
}

int main()
{
	int rr = MyPrintf("%ld, %lf, %c, %s\n", 
		456, 43.34, 'A', "hello, world");
	printf("%d\n", rr);
	return 0;
}
	


如果大家发现我这个程序的BUG的话,欢迎提出,大家共同学习。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值