专栏中心

EEPW首页 > 专栏 > 和printf一样具有可变参数的C51函数

和printf一样具有可变参数的C51函数

发布人:chen_yuangui 时间:2009-09-30 来源:工程师 发布文章
关键是stdarg.h中的几个宏:va_start、va_arg和va_end,下面是一个简化版本的printf(),请参考:

#include "stdio.h"
#include "stdarg.h"

int printf (const char *format, ...)
  {
    static const char hex[] = "0123456789ABCDEF";
    char format_flag;
    unsigned int u_val, div_val, base;
    char *ptr;
    va_list ap;

    va_start (ap, format);
  
    for (;;)    /* Until full format string read */
      {
        while ((format_flag = *format++) != ‘%‘)      /* Until ‘%‘ or ‘\0‘ */
      {
            if (!format_flag)
          {
            va_end (ap);
            return (0);
          }
        putchar (format_flag);
      }
    switch (format_flag = *format++)
      {
        case ‘c‘:
          format_flag = va_arg(ap, int);
        default:
          putchar (format_flag);
          continue;

        case ‘s‘:
          ptr = va_arg(ap,char *);
          while (format_flag = *ptr++)
        {
          putchar (format_flag);
        }
          continue;

        case ‘o‘:
          base = 8;
          if (sizeof(int) == 2)
        div_val = 0x8000;
          else
        div_val = 0xC0000000;
          goto CONVERSION_LOOP;

        case ‘d‘:
          base = 10;
          if (sizeof(int) == 2)
        div_val = 10000;
          else
        div_val = 1000000000;
          goto CONVERSION_LOOP;

        case ‘x‘:
          base = 16;
          if (sizeof(int) == 2)
        div_val = 0x1000;
          else
        div_val = 0x10000000;

        CONVERSION_LOOP:
          u_val = va_arg(ap,int);
          if (format_flag == ‘d‘)
        {
          if (((int)u_val) < 0)
            {
              u_val = - u_val;
              putchar (‘-‘);
            }
          while (div_val > 1 && div_val > u_val)
            {
              div_val /= 10;
            }
        }
          do
        {
          putchar (hex[u_val / div_val]);
          u_val %= div_val;
          div_val /= base;
        }
          while (div_val);
      }
      }
  }

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

使用DP83640实现标准网络IEEE 1588的同步演示

视频 2012-03-30

美国半导体行业协会明确反对《芯片安全法案》

内存原厂预告2Q「强劲涨价」 NVIDIA GTC 2026同步拉动声势

一种新型数控高压电源

MediaTek 于MWC 2026展示AI与通信优势

具 PFC 功能的隔离型反激式控制器可控制电压或电流

一种正负输出可调稳压电源

大嘴业话:乱谈三网融合

视频 2012-03-27

英飞凌即将亮相Embedded World 2026

大嘴业话:新iPad与LTE 谁绑架了谁

视频 2012-03-20

中国禁用隐藏式车门把手,车企成本增加供应商迎来机遇

村田提供《优化下一代数据中心 AI服务器的供电网络技术指南》

一种新颖的自适应PWM逆变电源

高通与多家行业领军企业致力于推动6G发展进程,自2029年起逐步实现6G商用

一种新颖的密封铅酸电池充电器的设计与应用

深耕智能5G,从容迈向6G:英特尔以可灵活部署 AI的网络架构,擘画产业未来

一种新颖的密封铅酸蓄电池充电器的设计

大嘴业话:“PC化”浪潮正在吞噬手机文化

视频 2012-03-13

罗姆加强GaN功率器件供应能力

汽车印制电路板(PCB)市场研究报告2025-2035

更多 培训课堂
更多 焦点
更多 视频

技术专区