鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 3

[技术交流] 自己写的简易sprintf

[复制链接]
发表于 2013-11-19 19:36:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wqlovt 于 2013-11-20 09:12 编辑
  1. /*
  2. * mysprintf.c
  3. *
  4. *  Created on: 2013-11-11
  5. *      Author: LOVT
  6. */

  7. #include "mysprintf.h"
  8. #include "stdio.h"


  9. //数据长度不能超过 65535
  10. u16 mystrlen(u8 u8str[])
  11. {
  12.         u16 i = 0;

  13.         while(u8str[i] != '\0')
  14.         {
  15.                 i ++;
  16.                 if(i > 65535)
  17.                         break;
  18.         }

  19.         return i;
  20. }

  21. u8 CheckIntLength(long lData)
  22. {
  23.         u8 u8Len = 0;

  24.         while(lData != 0)
  25.         {
  26.                 lData = lData / 10;
  27.                 u8Len ++;
  28.         }
  29.         return u8Len;
  30. }

  31. u32 GetCalcuData(u8 u8len)
  32. {
  33.         u32 u32Data;

  34.         if(u8len > 10)
  35.                 return 0;

  36.         switch(u8len)
  37.         {
  38.         case 0:
  39.                 u32Data = 1;
  40.                 break;
  41.         case 1:
  42.                 u32Data = 10;
  43.                 break;
  44.         case 2:
  45.                 u32Data = 100;
  46.                 break;
  47.         case 3:
  48.                 u32Data = 1000;
  49.                 break;
  50.         case 4:
  51.                 u32Data = 10000;
  52.                 break;
  53.         case 5:
  54.                 u32Data = 100000;
  55.                 break;
  56.         case 6:
  57.                 u32Data = 1000000;
  58.                 break;
  59.         case 7:
  60.                 u32Data = 10000000;
  61.                 break;
  62.         case 8:
  63.                 u32Data = 100000000;
  64.                 break;
  65.         case 9:
  66.                 u32Data = 1000000000;
  67.                 break;
  68.         default:
  69.                 break;

  70.         }

  71.         return u32Data;
  72. }

  73. /******************************************************************
  74. // Summary:     整形转化为字符串 10进制                 %d
  75. // Parameter:   [out/u8]u8Str[]               输出的字符串
  76. //                      [in/long]lData                数据
  77. //                      [in/u8]u8Width              宽度
  78. //                      [in/u8]u8Zero                是否0补齐  1补齐 0 不补
  79. //
  80. // Return:      [out/u8]返回缓存的实际使用大小
  81. ******************************************************************/
  82. u8 IntD2Str(u8 u8Str[], long lData, u8 u8Width, u8 u8Zero)
  83. {
  84.         u8 i = 0, j;
  85.         u8 u8Len, u8Len1 = 0;
  86.         u8 u8Flag = 0;
  87.         u8 u8Stt;
  88.         u8 u8LenMax = 0;

  89.         if(lData < 0)
  90.         {
  91.                 u8Str[i] = '-';
  92.                 i ++;
  93.                 lData = 0 - lData;
  94.                 u8Flag = 1;
  95.         }

  96.         u8Len = CheckIntLength(lData);
  97.         u8Len1 = u8Len;
  98.         if(u8Flag == 1)
  99.         {
  100.                 u8Len1 = u8Len + 1;
  101.         }

  102.         if(u8Zero == 1)
  103.         {
  104.                 if(u8Width > u8Len1)
  105.                 {
  106.                         u8Len1 = u8Width - u8Len1;
  107.                         u8Stt = i;
  108.                         for(i = 0; i < u8Len1; i ++)
  109.                         {
  110.                                 u8Str[u8Stt + i] = '0';
  111.                         }

  112.                         for(j = 0; j < u8Len; j ++)
  113.                         {
  114.                                 u8Str[u8Stt + u8Len1 + j] = lData / GetCalcuData(u8Len - 1 - j) + '0';
  115.                                 lData = lData % GetCalcuData(u8Len - 1 - j);
  116.                         }
  117.                         u8LenMax = u8Width;
  118.                 }
  119.                 else
  120.                 {
  121.                         for(j = 0; j < u8Len; j ++)
  122.                         {
  123.                                 u8Str[i + j] = lData / GetCalcuData(u8Len - 1 - j) + '0';
  124.                                 lData = lData % GetCalcuData(u8Len - 1 - j);
  125.                         }
  126.                         u8LenMax = i + u8Len;
  127.                 }
  128.         }
  129.         else
  130.         {
  131.                 for(j = 0; j < u8Len; j ++)
  132.                 {
  133.                         u8Str[i + j] = lData / GetCalcuData(u8Len - 1 - j) + '0';
  134.                         lData = lData % GetCalcuData(u8Len - 1 - j);
  135.                 }
  136.                 u8LenMax = i + u8Len;

  137.                 if(u8Width > u8Len1)
  138.                 {
  139.                         u8Stt = i + u8Len;
  140.                         u8Len1 = u8Width - u8Len1;
  141.                         for(i = 0; i < u8Len1; i ++)
  142.                         {
  143.                                 u8Str[u8Stt + i] = ' ';
  144.                         }
  145.                         u8LenMax = u8Width;
  146.                 }
  147.         }

  148.         return u8LenMax;
  149. }

  150. /******************************************************************
  151. // Summary:     浮点数转化为字符串                 %f
  152. // Parameter:   [out/u8]u8Str[]                输出的字符串
  153. //                      [in/float]fData                 数据
  154. //                      [in/u8]u8Width               宽度
  155. //                      [in/u8]u8Dot                   小数点个数
  156. //                      [in/u8]u8Align                是否开始对齐
  157. //
  158. // Return:      [out/u16]
  159. ******************************************************************/
  160. u8 Float2Str(u8 u8Str[], float fData, u8 u8Width, u8 u8Dot, u8 u8Align)
  161. {
  162.         u8 i = 0, j;
  163.         long lIntData, lDotData, lTemp;
  164.         u8 u8IntLen, u8DotLen;
  165.         u8 u8Len = 0;
  166.         u8 u8Stt;
  167.         u8 u8Flag = 0;
  168.         u8 u8LenMax = 0;

  169.         if(u8Align == 1)                                                                                                                 //左对齐
  170.         {
  171.                 if(fData < 0)
  172.                 {
  173.                         u8Str[i] = '-';
  174.                         i ++;
  175.                         fData = 0 - fData;
  176.                         u8Len = 1;
  177.                 }

  178.                 lIntData = (long)fData;
  179.                 u8IntLen = CheckIntLength(lIntData);

  180.                 for(j = 0; j < u8IntLen; j ++)                                                                                     //存整数部分
  181.                 {
  182.                         u8Str[i + j] = lIntData / GetCalcuData(u8IntLen - 1 - j) + '0';
  183.                         lIntData = lIntData % GetCalcuData(u8IntLen - 1 - j);
  184.                 }
  185.                 u8Str[i + u8IntLen] = '.';                                                                                           //存小数点

  186.                 lDotData = (long)((fData - (long)fData) * GetCalcuData(u8Dot + 1));                //小数部分 4舍5入
  187.                 lTemp = lDotData % 10;
  188.                 if(lTemp >= 5)
  189.                 {
  190.                         lDotData = lDotData / 10 + 1;
  191.                 }
  192.                 else
  193.                 {
  194.                         lDotData = lDotData / 10;
  195.                 }

  196.                 for(j = 0; j < u8Dot; j ++)                                                                                         //存小数部分
  197.                 {
  198.                         u8Str[i + u8IntLen + 1 + j] = lDotData / GetCalcuData(u8Dot - 1 - j) + '0';
  199.                         lDotData = lDotData % GetCalcuData(u8Dot - 1 - j);
  200.                 }
  201.                 u8Len += (1 + u8Dot + u8IntLen);
  202.                 u8LenMax = u8Len;
  203.                 if(u8Width > u8Len)
  204.                 {
  205.                         u8Len = u8Width - u8Len;
  206.                         u8Stt = i + u8IntLen + 1 + u8Dot;
  207.                         for(i = 0; i < u8Len; i ++)
  208.                         {
  209.                                 u8Str[u8Stt + i] = ' ';
  210.                         }
  211.                         u8LenMax = u8Width;
  212.                 }
  213.         }
  214.         else
  215.         {
  216.                 if(fData < 0)
  217.                 {
  218.                         fData = 0 - fData;
  219.                         u8Len = 1;
  220.                         u8Flag = 1;
  221.                 }
  222.                 lIntData = (long)fData;
  223.                 u8IntLen = CheckIntLength(lIntData);

  224.                 u8Len += (1 + u8Dot + u8IntLen);
  225.                 u8LenMax = u8Len;
  226.                 if(u8Width > u8Len)
  227.                 {
  228.                         u8Len = u8Width - u8Len;
  229.                 //        u8Stt = i + u8Len + 1 + u8Dot;
  230.                         for(i = 0; i < u8Len; i ++)                                                                                      //先补齐
  231.                         {
  232.                                 u8Str[i] = ' ';
  233.                         }
  234.                         u8Stt = u8Len;
  235.                         if(u8Flag == 1)
  236.                         {
  237.                                 u8Str[u8Stt] = '-';
  238.                                 u8Stt ++;
  239.                         }
  240.                         u8LenMax = u8Width;
  241.                 }
  242.                 else
  243.                 {
  244.                         u8Stt = 0;
  245.                         if(u8Flag == 1)
  246.                         {
  247.                                 u8Str[u8Stt] = '-';
  248.                                 u8Stt ++;
  249.                         }
  250.                 }
  251.                 for(j = 0; j < u8IntLen; j ++)                                                                                     //存整数部分
  252.                 {
  253.                         u8Str[u8Stt + j] = lIntData / GetCalcuData(u8IntLen - 1 - j) + '0';
  254.                         lIntData = lIntData % GetCalcuData(u8IntLen - 1 - j);
  255.                 }
  256.                 u8Str[u8Stt + u8IntLen] = '.';                                                                                   //存小数点

  257.                 lDotData = (long)((fData - (long)fData) * GetCalcuData(u8Dot + 1));                //小数部分 4舍5入
  258.                 lTemp = lDotData % 10;
  259.                 if(lTemp >= 5)
  260.                 {
  261.                         lDotData = lDotData / 10 + 1;
  262.                 }
  263.                 else
  264.                 {
  265.                         lDotData = lDotData / 10;
  266.                 }

  267.                 for(j = 0; j < u8Dot; j ++)                                                                                         //存小数部分
  268.                 {
  269.                         u8Str[u8Stt + u8IntLen + 1 + j] = lDotData / GetCalcuData(u8Dot - 1 - j) + '0';
  270.                         lDotData = lDotData % GetCalcuData(u8Dot - 1 - j);
  271.                 }
  272.         }

  273.         return u8LenMax;
  274. }

  275. //%s
  276. void Txt2Str(u8 u8Tgt[], u8 u8Src[])
  277. {
  278.         while(*u8Src != '\0')
  279.         {
  280.                 * u8Tgt ++ = *u8Src ++;
  281.         }
  282. }

  283. //一个参数                 浮点数 只支持       %-x.xf %x.xf  %.xf前后都可以加其他字符
  284. u8 mysprintf_1_float(u8 *u8Src, const u8 *u8Tgt, float fData)
  285. {
  286.         const u8 *u8Ptr = u8Tgt;
  287.         u8  i, u8SttAddr, u8SttAddr1;
  288.         u8        u8Len, u8Len1, u8LenMax;
  289.         u8        u8Temp, u8Width;
  290.         u8  u8Dot;
  291.         char Buf[5];

  292.         u8Len = mystrlen(u8Tgt);
  293.         if(u8Len > 32)
  294.                 return 0;

  295.         //获取%
  296.         for(i = 0; i < u8Len; i ++)
  297.         {
  298.                 if(u8Ptr[i] == '%')
  299.                 {
  300.                         u8SttAddr = i;
  301.                         break;
  302.                 }
  303.                 else
  304.                 {
  305.                         u8Src[i] = u8Ptr[i];
  306.                 }
  307.         }
  308.         u8LenMax = i;
  309.         for(i = 0; i < 5; i ++)
  310.         {
  311.                 if(u8Ptr[u8SttAddr + 1 + i] == 'f')
  312.                 {
  313.                         u8SttAddr1 = u8SttAddr + 1 + i;
  314.                         break;
  315.                 }
  316.                 else
  317.                 {
  318.                         Buf[i] = u8Ptr[u8SttAddr + 1 + i];
  319.                 }
  320.         }
  321.         if(i == 5 || i == 0 || i == 1)                        //%和f之间不能超过5的宽度的数据 或不支持该格式
  322.                 return 0;

  323.         if(i == 2)                //%.xf
  324.         {
  325.                 u8Dot = Buf[1] - '0';
  326.                 u8Len1 = Float2Str(u8Src + u8SttAddr, fData, 1, u8Dot, 0);
  327.                 u8LenMax += u8Len1;
  328.         }
  329.         else if(i == 3)
  330.         {
  331.                 u8Width = Buf[0] - '0';
  332.                 u8Dot = Buf[2] - '0';
  333.                 u8Len1 = Float2Str(u8Src + u8SttAddr, fData, u8Width, u8Dot, 0);
  334.                 u8LenMax += u8Len1;
  335.         }
  336.         else if(i == 4)
  337.         {
  338.                 if(Buf[0] == '-')
  339.                 {
  340.                         u8Width = Buf[1] - '0';
  341.                         u8Dot = Buf[3] - '0';
  342.                         u8Len1 = Float2Str(u8Src + u8SttAddr, fData, u8Width, u8Dot, 1);
  343.                         u8LenMax += u8Len1;
  344.                 }
  345.         }

  346.         u8SttAddr1 ++;
  347.         while(u8Ptr[u8SttAddr1] != '\0')
  348.         {
  349.                 u8Src[u8LenMax] = u8Ptr[u8SttAddr1];
  350.                 u8LenMax ++;
  351.                 u8SttAddr1 ++;
  352.         }

  353.         return 1;
  354. }

  355. //一个参数                 整形 只支持       %d %xd %0xd %xxd 前后都可以加其他字符
  356. u8 mysprintf_1_int(u8 *u8Src, const u8 *u8Tgt, long data)
  357. {
  358.         const u8 *u8Ptr = u8Tgt;
  359.         u8  i, u8SttAddr, u8SttAddr1;
  360.         u8        u8Len, u8Len1, u8LenMax;
  361.         u8        u8Temp, u8Width;
  362.         u8  u8Zero = 0;
  363.         char Buf[5];

  364.         u8Len = mystrlen(u8Tgt);
  365.         if(u8Len > 32)
  366.                 return 0;

  367.         //获取%
  368.         for(i = 0; i < u8Len; i ++)
  369.         {
  370.                 if(u8Ptr[i] == '%')
  371.                 {
  372.                         u8SttAddr = i;
  373.                         break;
  374.                 }
  375.                 else
  376.                 {
  377.                         u8Src[i] = u8Ptr[i];
  378.                 }
  379.         }
  380.         u8LenMax = i;
  381.         //获取d
  382.         for(i = 0; i < 3; i ++)
  383.         {
  384.                 if(u8Ptr[u8SttAddr + 1 + i] == 'd')
  385.                 {
  386.                         u8SttAddr1 = u8SttAddr + 1 + i;
  387.                         break;
  388.                 }
  389.                 else
  390.                 {
  391.                         Buf[i] = u8Ptr[u8SttAddr + 1 + i];
  392.                 }
  393.         }
  394.         if(i == 3)                                                                                   //%和d之间不能超过3的宽度的数据
  395.                 return 0;

  396.         if(i == 0)        //%d
  397.         {
  398.                 u8Len1 = IntD2Str(u8Src + u8SttAddr, (long)data, 1, 0);
  399.                 u8LenMax += u8Len1;
  400.         }
  401.         else if(i == 1) //%xd x 1-9
  402.         {
  403.                 u8Len1 = IntD2Str(u8Src + u8SttAddr, (long)data, Buf[0] - '0', 0);
  404.                 u8LenMax += u8Len1;
  405.         }
  406.         else if(i == 2)
  407.         {
  408.                 if(Buf[0] == '0')  //%0xd
  409.                 {
  410.                         u8Len1 = IntD2Str(u8Src + u8SttAddr, (long)data, Buf[1] - '0', 1);
  411.                         u8LenMax += u8Len1;
  412.                 }
  413.                 else                        //%xxd
  414.                 {
  415.                         u8Width = (Buf[0] - '0')* 10 +  (Buf[1] - '0');
  416.                         u8Len1 = IntD2Str(u8Src + u8SttAddr, (long)data, u8Width, 0);
  417.                         u8LenMax += u8Len1;
  418.                 }
  419.         }
  420.         u8SttAddr1 ++;
  421.         while(u8Ptr[u8SttAddr1] != '\0')
  422.         {
  423.                 u8Src[u8LenMax] = u8Ptr[u8SttAddr1];
  424.                 u8LenMax ++;
  425.                 u8SttAddr1 ++;
  426.         }

  427.         return 1;
  428. }

  429. int main(void)
  430. {
  431.         u8 *u8Str = "2ewqeqwttttw";
  432.         u8 u8Buf[32];
  433.         float fData = 15.856;

  434. //        printf("%d\r\n", mystrlen(u8Str));
  435. //        printf("%d\r\n", CheckIntLength(-5416));
  436. //        Int2Str(u8Buf, -15835);
  437. //        printf("%d", (long)fData);
  438. //        Float2Str(u8Buf, -55.62487, 3);
  439.         memset(u8Buf, 0, 32);
  440. //        sprintf(u8Buf, "%8.3f", 55.62);
  441. //        Txt2Str(u8Buf, "abcdefg");
  442. //        IntD2Str(u8Buf, -1234, 8, 1);
  443. //        Float2Str(u8Buf, -123.456, 8, 1, 1);
  444. //        IntD2Str(u8Buf, 52132, 1, 0);
  445. //        mysprintf_1_int(u8Buf, "SDSAR%4d: qweqweqw", 23);
  446. //        Float2Str();
  447. //        sprintf(u8Buf, "SDSAR%03d", 23);
  448.         mysprintf_1_float(u8Buf, "aasad%-7.3fdasda", 52.36);

  449.         return 0;
  450. }


复制代码
上面的是 .c文件

下面的是.h文件
  1. /*
  2. * mysprintf.h
  3. *
  4. *  Created on: 2013-11-11
  5. *      Author: Administrator
  6. */

  7. #ifndef MYSPRINTF_H_
  8. #define MYSPRINTF_H_

  9. #define u8        unsigned char
  10. #define u16 unsigned short
  11. #define u32 unsigned long





  12. #endif /* MYSPRINTF_H_ */
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-19 20:04:04 | 显示全部楼层
{:1_1:}刚学表示看不懂,顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-19 21:24:13 | 显示全部楼层
头看大了:mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

我爱鱼C论坛 该用户已被删除
发表于 2015-2-19 21:08:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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