在上一版基礎上,增加對格式字符串中轉義字符(\t、\n)的直接輸出支援,並優化參數獲取邏輯。格式字符串:"dc\ts\ndc\ndc\ts!",對應參數:1, 'b', "zhangweina", 2, 'i', 3, 't', "welcome to you"。
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void my_printf(const char *str, int len, ...) {
va_list ap; va_start(ap, len);
for (int i = 0; i < len; i++, str++) {
switch (*str) {
case 'c': { char c = va_arg(ap, char); putchar(c); break; }
case 's': { char *s = va_arg(ap, char*); while (*s) putchar(*s++); break; }
case 'd': { int d = va_arg(ap, int); putchar('0' + d); break; } // 單位數演示
default: putchar(*str); break; // 包含 \t \n 等轉義字符直接輸出
}
}
va_end(ap);
}
int main() {
char *fmt = "dc\ts\ndc\ndc\ts!";
int len = strlen(fmt);
my_printf(fmt, len, 1, 'b', "zhangweina", 2, 'i', 3, 't', "welcome to you");
return 0;
}
格式字符串逐字符處理:
'd' → 取 int 輸出 '1''c' → 取 char 輸出 'b''\t' → 直接輸出製表符's' → 取 char* 輸出 "zhangweina"'\n' → 換行最終輸出:
1b zhangweina
2i
3t welcome to you!
%d 僅支援單位數,多位數需實現 print_int 遞歸分解。len),不如標準 printf 由格式字符串隱含參數數量。+ - 0 # space)支援。模擬 printf 關鍵在於:格式字符串有限狀態機(普通字符直通、% 進入格式解析)、va_list 參數串聯、各類型格式化輸出。此版本展示核心骨架,工程級實現需處理極其龐大的邊界情況。