来自: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. Hadoop_CDH安装

    ——本文非个人原创,为大牛同事整理,发布于此以备忘 1     CDH5.8安装(2018年4月19日) 1.1   物理服务器注意事项 (1)把raid都去掉了,每个物理盘都用raid0创建一个虚拟 ...

  2. excle中表引用

  3. Spock - Document -01- introduction & Getting Started

    Introduction Peter Niederwieser, The Spock Framework TeamVersion 1.1 Spock is a testing and specific ...

  4. .NET中的StringBuilder

    为什么要使用StringBuilder 为什么使用StringBuilder要从string对象的特性说起. string对象在进行字符串拼接时,因为字符串的不可变性,string对象会每次拼接,都会 ...

  5. PYTHON的前端部分

    CSS部分,CSS起到修饰HTML的作用比如颜色,字体,等等. css如何和HTML共同其作用,那么CSS有几种引入HTML的方式 那么当引入了CSS如何让css对应的使相应的HTML标签上起作用,就 ...

  6. consul & registrator & consul-template 使用

    consul & registrator & consul-template 使用 参考这里的文章: https://www.jianshu.com/p/a4c04a3eeb57 do ...

  7. edgedb 内部pg 数据存储的探索 (一)基本环境搭建

    edgedb 是基于pg 上的对象关系数据库,已经写过使用docker 运行的demo,为了探索内部的原理,做了一下尝试,开启pg 访问 后边会进一步的学习 环境准备 为了测试,使用yum 安装 安装 ...

  8. Django学习笔记之安全

    CSRF攻击 CSRF攻击概述 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全 ...

  9. python 基础之自动类型转换和强制类型转换

    一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...

  10. 运维wiki

    意识 1.责任心 要有 owner 意识.运维是线上产品的首要负责人,出现故障都默认是运维的故障,要推动改进. 2.细心 要有敏感的风险意识,稳定和安全是运维的最高责任 3.上进心 要善于学习,不断反 ...