关键是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的同步演示
美国半导体行业协会明确反对《芯片安全法案》
VGA接口电路
百套嵌入式资料及软件系统
内存原厂预告2Q「强劲涨价」 NVIDIA GTC 2026同步拉动声势
一种新型数控高压电源
请问S3C4510的JTAG部分的用74LS126行不行?
百套嵌入式资料及软件系统
[讨论]任务堆栈和系统堆栈
MediaTek 于MWC 2026展示AI与通信优势
RAM的控制电路图
具 PFC 功能的隔离型反激式控制器可控制电压或电流
一种正负输出可调稳压电源
PS/2键盘接口电路
大嘴业话:乱谈三网融合
FPGA程序原理图
电源电路
英飞凌即将亮相Embedded World 2026
大嘴业话:新iPad与LTE 谁绑架了谁
中国禁用隐藏式车门把手,车企成本增加供应商迎来机遇
村田提供《优化下一代数据中心 AI服务器的供电网络技术指南》
一种新颖的自适应PWM逆变电源
高通与多家行业领军企业致力于推动6G发展进程,自2029年起逐步实现6G商用
难道tornado2.2做的BSP再也不能用vxload.com在DOS/WIN98下load起来了吗?
一种新颖的密封铅酸电池充电器的设计与应用
深耕智能5G,从容迈向6G:英特尔以可灵活部署 AI的网络架构,擘画产业未来
一种新颖的密封铅酸蓄电池充电器的设计
大嘴业话:“PC化”浪潮正在吞噬手机文化
罗姆加强GaN功率器件供应能力
汽车印制电路板(PCB)市场研究报告2025-2035