RSS

C51函数之可变参数

来源:网络 作者:佚名 时间:2008-03-09 Tag: 点击:

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);
}
}
}
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载