本篇实现的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; }
输出结果: