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)++