printf 核心機制:格式化字符串解析 + 可變參數訪問(<stdarg.h>)。本文實現簡易版 my_printf,支援 %s(字符串)、%c(字符)、%d(整數,轉字符輸出)、普通字符直輸出。
va_list ap; // 1. 宣告參數列表指針
va_start(ap, fmt); // 2. 初始化,指向 fmt 後第一個可變參數
// va_arg(ap, type) 取參
va_end(ap); // 3. 清理
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
while (*fmt) {
if (*fmt != '%') { putchar(*fmt++); continue; }
fmt++; // 跳過 %
switch (*fmt) {
case 's': {
const char *s = va_arg(ap, const char*);
while (*s) putchar(*s++);
break;
}
case 'c': {
char c = (char)va_arg(ap, int); // char 會提升為 int
putchar(c);
break;
}
case 'd': {
int val = va_arg(ap, int);
// 簡易整數輸出(遞歸/迴圈),這裡直接 putchar 單字符演示
// 實際需處理負號、多位數,略
putchar('0' + val); // 僅演示單位數
break;
}
default: putchar(*fmt); break;
}
fmt++;
}
va_end(ap);
return 0;
}
int main() {
my_printf("ccc\ts!", 'b', 'i', 't', "welcome to you");
// 輸出: ccc bitwelcome to you
return 0;
}
va_arg(ap, int) 取 char:C 規定 char 可變參數會整數提升為 int,故取 int 再轉 char。% 進入 switch,根據後續字符分發。%x/%o 等進制,此處略。模擬 printf 核心在於:va_list 串聯可變參數、格式字符串有限狀態機解析、各類型格式化輸出。標準庫實現極其複雜(支援寬度、精度、長度修飾、區域化等),但核心骨架一致。