来自: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\n", 'c');
  print("print %d\n", 1234567);
  print("print: %f\n", 1234567.1234567);
  print("print: %s\n", "string test");
  print("print: %b\n", 0x12345ff);
  print("print: %x\n", 0xabcdef);
  print("print: %%\n");
  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' ));
  }
}

嵌入式 printf函数的更多相关文章

  1. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  2. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...

  3. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  4. 关于printf函数的所思所想

    缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题.涉及网上资料将会标明出处. 关于printf函数的所思所想 * printf的定义 printf( ...

  5. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  6. 关于printf函数输出先后顺序的讲解!!

    对于printf函数printf("%d%d\n",a,b);函数的实际输出顺序是这样的先计算出b,然后在计算a,接着输出a,最后在输出b:例子如下:#include<ios ...

  7. printf()函数

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息. printf()函数的调用格式为: printf("<格式化字符串>", <参 ...

  8. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  9. printf函数重定向

    printf函数底层会调用fputc函数 /*重定向c库函数printf到USART1*/ int fputc(int ch, FILE *f) { /*发送一个字节数据USART1 */ USART ...

随机推荐

  1. install kali on my x200

    1 下载kali镜像,选择tsinghua tuna mirror https://mirrors.tuna.tsinghua.edu.cn/kali-images/current/ 选择light版 ...

  2. 安装ruby及sass

    下载 ruby安装包,安装后,进入: 输入: gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ ...

  3. apply,call以及bind的区别

    每个函数都包含两个非继承而来的方法:apply()和 call(). 这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值. 一.apply() apply()方法 ...

  4. PTA L2-4 关于堆的判断

    先上题面 链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888 首先,题目描述的很清楚,这是 ...

  5. JSF生命周期&Facelets的生命周期

    1.JSF生命周期 1)恢复视图(Restore View) 视图表示组成特定页面的所有组件.它被保存在 客户端(通常存储在隐藏字段中)或服务器中(通常在会话中).根据请求访问的视图ID(页面地址), ...

  6. Python练习二

    1.计算 1 - 2 + 3 ... + 99 中除了88以外所有数的总和 sum1 = 0 sum2 = 0 count = 0 while count < 99: count += 1 if ...

  7. myBatis---接口代理开发(demo)

    一.概述 使用接口代理开发,可以不用写接口的实现类,而采用的是MapperFactoryBean代理的实现类. * 接口代理方式开发,遵循四大原则 * 1.方法名 == mapper.xml的id名 ...

  8. java基本数据类型和运算符

    一.基本数据类型 种类: 内置数据类型 引用数据类型 1.内置数据类型 一共有八种基本类型,六个数字类型(四个整数类型,两个浮点型),一个布尔型,一个字符类型. (1)byte: byte数据类型是8 ...

  9. SpeedReader for Mac(快速阅读器)v1.6免费版

    SpeedReader for Mac是一款运行在Mac平台上的阅读软件,通过这款软件就可以自行调整阅读速度.通过SpeedReader Mac版用户可以将想要阅读的内容拖入到软件中,调整速度和字体, ...

  10. install rust

    Step 1. Trial 1 Download rustup-init.exe exec rustup-init.exe SW hangs 2. Trial 2 install rust-1.33. ...