26.实现printf

本文详细介绍了如何实现C语言中的printf函数,从printf的基础概念出发,解析了vsprintf如何处理格式化字符串,以及简易write系统调用的实现步骤。通过va_start、va_arg和va_end宏管理可变参数,最后阐述了printf调用vsprintf和write完成输出的整个流程。
摘要由CSDN通过智能技术生成

1.printf是什么?

printf是c语言的标准输出函数,原型是

int printf(const char *format, …);

其中format 是格式化字符串,其中就包含“%类型字符”.
“…”是可变参数,参数不固定。

printf 由两个函数封装而成,一个是 vsprintf ,另一个是 write。
vsprintf 负责把 format 中的%d、%s、%c……给替换成真正的样子,用后面的参数来替换。
write 负责把替换号的字符串打印输出到屏幕上。

2.实现 vsprintf

#define va_start(ap, v) ap = (va_list)&v  // 把ap指向第一个固定参数v
#define va_arg(ap, t) *((t*)(ap += 4))	  // ap指向下一个参数并返回其值
#define va_end(ap) ap = NULL		  // 清除ap

/* 将整型转换成字符(integer to ascii) */
static void itoa(uint32_t value, char** buf_ptr_addr, uint8_t base) {
   
   uint32_t m = value % base;	    // 求模,最先掉下来的是最低位   
   uint32_t i = value / base;	    // 取整
   if (i) {
   			    // 如果倍数不为0则递归调用。
      itoa(i, buf_ptr_addr, base);
   }
   if (m < 10) {
         // 如果余数是0~9
      *((*buf_ptr_addr)++) = m + '0';	  // 将数字0~9转换为字符'0'~'9'
   } else {
   	      // 否则余数是A~F
      *((*buf_ptr_addr)++
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值