找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2346|回复: 0
打印 上一主题 下一主题
收起左侧

跨平台移植printf

[复制链接]
跳转到指定楼层
楼主
ID:75926 发表于 2015-4-10 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在MUC中只要给出 putc() 向显示器输出一个字符 的函数的实现 就可以吧 printf() 的功能移植上去了
  1. #include "stdio.h"
  2. #include "stdarg.h"

  3. void put_str(char *str)
  4. {
  5.     while(*str)
  6.     {
  7.         putc(*str,stdout);
  8.         str++;
  9.     }
  10. }

  11. void put_int(int num)
  12. {
  13.     char s[15];
  14.     int temp=num;
  15.     char i=0,cnt;
  16.     if(num==0)
  17.     {
  18.         putc('0',stdout);
  19.         return;
  20.     }
  21.     while(temp)
  22.     {
  23.         i++;
  24.         temp/=10;
  25.     }
  26.     if(i>14)
  27.         return;
  28.     s[i]=0;
  29.     for(cnt=i-1;cnt>=0;cnt--)
  30.     {
  31.         s[cnt]=num%10+'0';
  32.         num/=10;
  33.     }
  34.     put_str(s);
  35. }

  36. void put_float(double num)
  37. {
  38.     double temp=num;
  39. char j=0;
  40.     long temp1,temp3;
  41. double temp2;
  42.     int i=0,cnt;
  43.     char s[25];
  44.     if(num==0)
  45.     {
  46.         put_str("0.000000");
  47.         return;
  48.     }
  49.     temp1=(long)temp;
  50. temp2=temp-temp1;
  51. temp2*=1000000;
  52. if((long)temp2==0)
  53. {
  54. put_int(temp1);
  55. return;
  56. }
  57.     while(temp1)
  58.     {
  59.         i++;
  60.         temp1/=10;
  61.     }
  62. temp1=(long)temp;
  63. temp3=(long)temp2;
  64. while(temp3)
  65.     {
  66.         i++;
  67.         temp3/=10;
  68.     }
  69. temp3=(long)temp2;

  70.     s[i+1]=0;
  71.     for(cnt=i;cnt>=0;cnt--)
  72.     {
  73. if(temp3==0&&j==0)
  74. {
  75. s[cnt]='.';
  76. j++;
  77. continue;
  78. }
  79. if(temp3!=0)
  80. {
  81. s[cnt]=temp3%10+'0';
  82. temp3/=10;
  83. }
  84. else if(j==1)
  85. {
  86. s[cnt]=temp1%10+'0';
  87. temp1/=10;
  88. }
  89.     }
  90.     put_str(s);
  91. }

  92. void my_printf(char *fm,...)
  93. {
  94. va_list ap;
  95. char *p, *sval;
  96. int ival;
  97. double dval;
  98. va_start(ap, fm);
  99. for(p=fm;*p;p++)
  100. {
  101. if(*p!='%')
  102. {
  103. putc(*p,stdout);
  104. continue;
  105. }
  106. switch(*++p)
  107. {
  108. case 'd':
  109.              ival = va_arg(ap, int);
  110.              put_int(ival);
  111.              break;
  112.         case 'f':
  113.              dval = va_arg(ap, double);
  114.              put_float(dval);
  115.              break;
  116.         case 's':
  117.           sval = va_arg(ap, char *);
  118.                put_str(sval);
  119.              break;
  120.         default:
  121.              putc(*p,stdout);
  122.              break;
  123. }
  124. }
  125. }

  126. int main()
  127. {
  128. my_printf("%f",123.0);
  129. printf("\n");
  130. return 0;
  131. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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