zoukankan      html  css  js  c++  java
  • 嵌入式 printf函数

    来自:https://www.cnblogs.com/02xiaoma/archive/2012/06/22/2558618.html

    #include <stdio.h> #include <stdarg.h>
    #include "print.h"

    int main(void)
    {
      print("print: %c ", 'c');
      print("print %d ", 1234567);
      print("print: %f ", 1234567.1234567);
      print("print: %s ", "string test");
      print("print: %b ", 0x12345ff);
      print("print: %x ", 0xabcdef);
      print("print: %% ");
      return 0;
    }

    void print(char* fmt, ...)
    {
      double vargflt = 0;
      int vargint = 0;
      char* vargpch = NULL;
      char vargch = 0;
      char* pfmt = NULL;
      va_list vp;

      va_start(vp, fmt);
      pfmt = fmt;

    while(*pfmt)
    {
      if(*pfmt == '%')
      {
        switch(*(++pfmt))
        {

          case 'c':
          vargch = va_arg(vp, int);
          /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
              mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
          printch(vargch);
          break;
        case 'd':
        case 'i':
        vargint = va_arg(vp, int);
        printdec(vargint);
        break;
        case 'f':
        vargflt = va_arg(vp, double);
        /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
        mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
        printflt(vargflt);
        break;
        case 's':
          vargpch = va_arg(vp, char*);
          printstr(vargpch);
        break;
        case 'b':
        case 'B':
          vargint = va_arg(vp, int);
          printbin(vargint);
        break;
        case 'x':
        case 'X':
          vargint = va_arg(vp, int);
          printhex(vargint);
        break;
        case '%':
          printch('%');
        break;
        default:
        break;
      }
      pfmt++;
      }
      else
      {
        printch(*pfmt++);
      }
      }
      va_end(vp);
    }

    void printch(char ch)
    {
      console_print(ch);
    }

    void printdec(int dec)
    {
      if(dec==0)
      {
        return;
      }
      printdec(dec/10);

      {
        printch( (char)(dec%10 + '0'));
      }

    void printflt(double flt)
    {
      int icnt = 0;
      int tmpint = 0;

      tmpint = (int)flt;
      printdec(tmpint);
      printch('.');
      flt = flt - tmpint;
      tmpint = (int)(flt * 1000000);
      printdec(tmpint);
    }

    void printstr(char* str)
    {
      while(*str)
      {
        printch(*str++);
      }
    }

    void printbin(int bin)
    {
      if(bin == 0)
      {
        printstr("0b");
        return;
      }
      printbin(bin/2);
      printch( (char)(bin%2 + '0'));
    }

    void printhex(int hex)
    {
      if(hex==0)
      {
        printstr("0x");
        return;
      }
      printhex(hex/16);
      if(hex < 10)
      {
        printch((char)(hex%16 + '0'));
      }
      else
      {
        printch((char)(hex%16 - 10 + 'a' ));
      }
    }

  • 相关阅读:
    跨域现象及原理分析
    git的commit撤销
    什么是幂等,什么情况下需要幂等,如何实现幂等
    flowable表简要说明
    关于SpringCloud、SpringBoot简单讲解
    常用的maven仓库地址
    Python安装第三方库常用方法
    反编译pyinstaller打包的exe安装包
    测试用例-需要添加@Transactional 这样 就不会再数据库里面留下痕迹了
    断点 太多了 调试运行特别慢-把所有的历史断点都去掉就快了
  • 原文地址:https://www.cnblogs.com/qinshizhi/p/10673566.html
Copyright © 2011-2022 走看看