来自: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. 个人项目cpu占用图

  2. 动态改变Spring定时任务执行频率

    @Component@EnableSchedulingpublic class updateCronTask implements SchedulingConfigurer { public stat ...

  3. Visual C++ 6.0中if..else..的简单用法和基本格式

    # include <stdio.h> int main (void) { float score; printf("请输入您的考试成绩:"); scanf(" ...

  4. Cannot create PoolableConnectionFactory (Communications link failure The last packet sent successfu

    SQL: Cannot create JDBC driver of class '' for connect URL 使用数据库数据源的web 项目,发布后,访问数据库500报错: 浏览器端: 控制台 ...

  5. O/R关系的深入理解(转载)

    本文转载自aa8945163: http://aa8945163.iteye.com/blog/859713 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型和关系型数据库的数据 ...

  6. FileUrl

    package com.rscode.credits.util; import java.io.BufferedReader; import java.io.File; import java.io. ...

  7. Image Widget 的几种加入形式

    image .asset : 加载资源图片,会使打包时包体过大 image.network :网络资源图片,经常换的或者动态的图片 image file : 本地图片,比如相册 重用属性:  fit ...

  8. js 数字随机滚动(数字递增) 每日凌晨回到原点,重新计算

    html: <div class="textMon"> <!--<img src="./img/20180830160315.png" ...

  9. webbug3.0靶场第二关

    由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...

  10. Django-api认证

    验证过程:每一个中控机有一个key,然后获取到当前时间戳.把key和当前时间戳这两个值进行一次加密,加密之后得到加密的戳,把加密的戳和当前获取的时间戳用管道符分割开生成一个大的字符串(加密戳|时间戳) ...