【C】库函数之printf

  本篇实现的printf函数声明为:

void VarPrint(const char * format, ...);

  主要实现了对字符串、字符以及数字(ps:正负数和0)的打印,当然这只是实现了一部分功能,后续版本会支持多种格式打印,敬请期待。

算法分析

  从要打印的内容开始,每次判断一个字符是否是'%',假如不是'%',那么原样输出(用putchar即可),假如是'%',接下来去判断'%'后面的字符是s,还是c,或者d,最后根据格式打印输出即可。

  注意:打印字符串时切记不使用puts,这是因为puts打印完要输出的语句后会自动换行。

源代码:

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:VarPrint.c
* 功能:模拟实现printf函数
*       支持%s、%c、%d等格式的输出
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年4月20日11:12:26
*/

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

/*
*	函数名称:PrintStr
*
*	函数功能:打印字符串
*
*	入口参数:str
*
*	出口参数:void
*
*	返回类型:void
*/

void PrintStr(char * str)
{
	assert(NULL != str);

	while ('\0' != *str)
	{
		putchar(*str++);
	}

	return;
}

/*
*	函数名称:PrintInt
*
*	函数功能:打印数字
*
*	入口参数:num
*
*	出口参数:void
*
*	返回类型:void
*/

void PrintInt(int num)
{
	if (num >= 0)
	{
		if (num > 9)
		{
			PrintInt(num / 10);
		}
		else
		{
			;
		}

		putchar(num % 10 + '0');
	}
	else
	{
		putchar('-');

		if ((-num) > 9)
		{
			PrintInt((-num) / 10);
		}
		else
		{
			;
		}

		putchar((-num)%10 + '0');
	}

	return;
}

/*
*	函数名称:VarPrint
*
*	函数功能:实现printf函数
*
*	入口参数:format, ...
*
*	出口参数:void
*
*	返回类型:void
*/

void VarPrint(const char * format, ...)
{
	va_list arg;
	int i = 0;
	int count = 0;

	assert(NULL != format);
	va_start(arg, format);

	while ('\0' != *format)
	{
		if ('%' == *format)
		{
			switch(*(++format))
			{
				case 's':
					PrintStr(va_arg(arg, char *));
					break;
				case 'c':
					putchar(va_arg(arg, unsigned int));
					break;
				case 'd':
					PrintInt(va_arg(arg, int));
					break;
				default:
					break;
			}

			format++;
		}
		else
		{
			putchar(*format++);
		}
	}

	va_end(arg);

	return;
}

int main(void)
{
	VarPrint("printstr: %s\n", "h e l l o");
	VarPrint("printchar: %c\n", 'c');
	VarPrint("printchar: %c\n", 'h');
	VarPrint("printchar: %c\n", 'i');
	VarPrint("printchar: %c\n", 'n');
	VarPrint("printchar: %c\n", 'a');
	VarPrint("printint: %d\n", -520);
	VarPrint("printint: %d\n", 1314);
		
	return 0;
}

输出结果:


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80200297