您的位置:首页 > 编程语言 > C语言/C++

自己用C语言写一个简易printf

2017-01-17 18:57 225 查看
#include <stdio.h>

#include <stdlib.h>

#include "stdarg.h"

void PrintInt(unsigned int Num);//输出正整数

void PrintString(char *str);//输出字符串

void PrintInt_2(int Num);//输出整数

void PrintBit(int Bit);//输出二进制数

void PrintFloat(float Num);//输出浮点数

void PrintFamt(const char *Format,...);//自己写的printf

int main()

{

int x=12;

float y=12.5;

char *p="123";

PrintFamt("x=%d\ty=%f\t*p=%s\n",x,y,p);

return 0;

}

void PrintBit(int Bit)

{

char bit;

for(bit=31;bit>=0;bit--)

{

if(Bit&(1<<31))

PrintChar('1');

else

PrintChar('0');

Bit<<=1;

PrintChar(' ');

}

}

void PrintChar(char ch)

{

fprintf(stdout,"%c",ch);

}

void PrintString(char *str)

{

while(*str)

PrintChar(*str++);

}

int Ex(char num)

{

int Temp=1;

while(num--)

{

Temp*=10;

}

return Temp;

}

void PrintInt(unsigned int Num)

{

unsigned char bit;

unsigned char number;

unsigned int Temp=Num;

unsigned char Length=0;

if(Num==0)

{

PrintChar('0');

return;

}

while(Temp)

{

Length++;

Temp/=10;

}

Temp=Num;

for(bit=0;bit<Length;bit++)

{

number=Temp/Ex(Length-bit-1);

PrintChar(number+'0');

Temp%=Ex(Length-bit-1);

}

}

void PrintInt_2(int Num)

{

if(Num&(1<<31))

{

PrintChar('-');

// Num=Num&(1<<31);

PrintInt(~(Num-1));

}

else

{

PrintInt(Num);

}

}

void PrintFloat(float Num)

{

int Temp=(int)Num;

int fTemp=Ex(6)*(Num-(int)Num);

PrintInt_2(Temp);

PrintChar('.');

if(fTemp&(1<<31))

PrintInt_2(~(fTemp-1));

else

{

PrintInt_2(fTemp);

}

}

void PrintFamt(const char *Format,...)

{

va_list ap;

va_start(ap,Format);

while(*Format)

{

switch(*Format)

{

case '%':{

switch(*(Format+1))

{

case 'd':PrintInt_2(va_arg(ap,int));Format++;break;

case 'f':PrintFloat(va_arg(ap,double));Format++;break;

case 's':PrintString(va_arg(ap,char*));Format++;break;

default:PrintChar('%');break;

}

};break;

case '\n':PrintChar('\n');break;

case '\t':PrintChar('\t');break;

default :PrintChar(*Format);

}

Format++;

}

va_end(ap);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: