VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 354|回复: 1

[原创] C语言实现简单的Printf

[复制链接]
31_avatar_middle
在线会员 Eirik 发表于 2018-4-26 11:12:04 | 显示全部楼层 |阅读模式
// Printf.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;

void Printf(const char* pForMat,...);
void StrOutput(const char * pStr);
void I2A(int nNum,char *pStr);
void F2A(float nNum,char *pStr);
void I2B(int nNum);//binary
void I2O(int nNum);//octal
void I2H(int nNum);//hex

int main()
{
        Printf("c: %c d: %d s: %s b: %b o:%o h: %h",'c',123,"Ajw",12,12,12);
    return 0;
}

void Printf(const char* pForMat, ...)
{
        int ** pTemp = (int **)&pForMat;
        pTemp++;
        for (int i=0;'\0'!= pForMat[i];i++)
        {
                if ('%'== pForMat[i])
                {
                        i++;
                        switch (pForMat[i])
                        {
                        case 'c':
                        case 'C':
                                putchar(*(char*)pTemp);
                                pTemp++;
                                break;
                        case 'd':
                        case 'D':
                        {
                                char szbuf[233]= "";
                                I2A(*(int*)pTemp,szbuf);
                                StrOutput(szbuf);
                                pTemp++;       
                        }
                        break;
                        case 'b':
                        case 'B':
                        {
                                I2B(*(int*)pTemp);
                                pTemp++;
                        }
                        break;
                        case 'o':
                        case 'O':
                        {
                                I2O(*(int*)pTemp);
                                pTemp++;
                        }
                        break;
                        case 'h':
                        case 'H':
                        {
                                I2H(*(int*)pTemp);
                                pTemp++;
                        }
                        break;
                        case 's':
                        case 'S':
                        {
                StrOutput((*(char **)pTemp));
                                pTemp++;
                                break;
                        }
                        default:
                                putchar(pForMat[--i]);
                                break;
                        }
                }
                else
                {
                        putchar(pForMat[i]);
                }
        }
}
void StrOutput(const char * pStr)
{
        if (NULL!=pStr)
        {
                for (int i = 0; '\0'!= pStr[i]; i++)
                {
                        putchar(pStr[i]);
                }
        }
}
void I2A(int nNum, char *pStr)
{
        int nTemp = nNum;
        int nDigit = 0;
        while (0!=nTemp)
        {
                nTemp /= 10;
                nDigit++;
        }
        pStr[nDigit--] = '\0';
        while (nDigit>0)
        {
                pStr[nDigit--] = nNum % 10 + '0';
                nNum /= 10;
        }
}
void I2B(int nNum)
{
        char pStr[233] = "";
        int ntemp = 0x01;
        char szbuf[3] = "01";
        int size = sizeof(int) * 8-1;

        for (int i = 0; i < size; i++)
        {
                pStr[i] = szbuf[ntemp&nNum];
                nNum >>= 1;
        }
        for (int i = size-1; i >= 0; i--)
        {
                putchar(pStr[i]);
        }
}
void I2O(int nNum)
{
        char pStr[233] = "";
        unsigned int ntemp = 0x07;

        char szbuf[9] = "01234567";
        int size = sizeof(int) * 3;

        for (int i = 0; i < size; i++)
        {
                pStr[i] = szbuf[ntemp&nNum];
                nNum >>= 3;
        }
        for (int i = size-1; i >= 0; i--)
        {
                putchar(pStr[i]);
        }
}
void I2H(int nNum)
{
        char pStr[233] = "";
        int ntemp = 0x0F;
        char szbuf[17] = "0123456789ABCDEF";
        int size = sizeof(int) *2;//32 位系统中 int:4个字节 4*8 即32位 但一个二进制记录一个16进制要用4位

        for (int i = 0; i < size; i++)
        {
                pStr[i] = szbuf[ntemp&nNum];
                nNum >>= 4;
        }
        for (int i = size-1; i >= 0; i--)
        {
                putchar(pStr[i]);
        }
}




上一篇:vs2008 单文档中 VC 如何实现当鼠标移动到一个菜单上时,任务栏有相应的提示
下一篇:C语言黑客教程第三课 带界面的开关机、注销(日常打卡)

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

81_avatar_middle
online_moderator Debug 发表于 2018-4-26 11:17:01 | 显示全部楼层
不错哦,自打从学习 C语言 开始就经常使用 printf 函数,一直也没想过自己实现一遍 printf 的功能。看着楼主的代码也算是学习了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-13 08:42

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表