标题:
跨平台移植printf
[打印本页]
作者:
xiaos
时间:
2015-4-10 17:18
标题:
跨平台移植printf
在MUC中只要给出 putc() 向显示器输出一个字符 的函数的实现 就可以吧 printf() 的功能移植上去了
#include "stdio.h"
#include "stdarg.h"
void put_str(char *str)
{
while(*str)
{
putc(*str,stdout);
str++;
}
}
void put_int(int num)
{
char s[15];
int temp=num;
char i=0,cnt;
if(num==0)
{
putc('0',stdout);
return;
}
while(temp)
{
i++;
temp/=10;
}
if(i>14)
return;
s[i]=0;
for(cnt=i-1;cnt>=0;cnt--)
{
s[cnt]=num%10+'0';
num/=10;
}
put_str(s);
}
void put_float(double num)
{
double temp=num;
char j=0;
long temp1,temp3;
double temp2;
int i=0,cnt;
char s[25];
if(num==0)
{
put_str("0.000000");
return;
}
temp1=(long)temp;
temp2=temp-temp1;
temp2*=1000000;
if((long)temp2==0)
{
put_int(temp1);
return;
}
while(temp1)
{
i++;
temp1/=10;
}
temp1=(long)temp;
temp3=(long)temp2;
while(temp3)
{
i++;
temp3/=10;
}
temp3=(long)temp2;
s[i+1]=0;
for(cnt=i;cnt>=0;cnt--)
{
if(temp3==0&&j==0)
{
s[cnt]='.';
j++;
continue;
}
if(temp3!=0)
{
s[cnt]=temp3%10+'0';
temp3/=10;
}
else if(j==1)
{
s[cnt]=temp1%10+'0';
temp1/=10;
}
}
put_str(s);
}
void my_printf(char *fm,...)
{
va_list ap;
char *p, *sval;
int ival;
double dval;
va_start(ap, fm);
for(p=fm;*p;p++)
{
if(*p!='%')
{
putc(*p,stdout);
continue;
}
switch(*++p)
{
case 'd':
ival = va_arg(ap, int);
put_int(ival);
break;
case 'f':
dval = va_arg(ap, double);
put_float(dval);
break;
case 's':
sval = va_arg(ap, char *);
put_str(sval);
break;
default:
putc(*p,stdout);
break;
}
}
}
int main()
{
my_printf("%f",123.0);
printf("\n");
return 0;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1