新闻  |   论坛  |   博客  |   在线研讨会
和printf一样具有可变参数的C51函数
chen_yuangui | 2009-09-30 00:13:13    阅读:1913   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
我们赖以生存的空间每时每刻都在变化着,正是它的非线性赋予了我们五彩缤纷的生活!
推荐文章
最近访客