您的位置:首页单片机其他单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

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

[日期:2007-12-27 ] [来源: 作者:] [字体: (投递新闻)

, 关键是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);
      }
      }
  }

 

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐