scanf 族函數本質是讀取標準輸入並按格式解析賦值。標準庫提供 vscanf 接受 va_list,封裝極簡:
#include <stdio.h>
#include <stdarg.h>
int myscanf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
int ret = vscanf(fmt, ap); // 委託標準庫核心解析
va_end(ap);
return ret;
}
int main() {
int num;
printf("pls input num:\n");
myscanf("%d", &num);
printf("num: %d\n", num);
return 0;
}
pls input num:
100
num: 100
若需從零實現(如內核、嵌入式),需:
getchar/UART/鍵盤驅動)。vprintf 邏輯)。scan_int、scan_string 等),從輸入流讀取、跳過空白、轉換、寫入 va_arg 給出的地址。EOF/匹配失敗)。這實際上是構建一個**掃描器**,複雜度遠高於 printf。工程中極少自行實現完整 scanf,通常移植 newlib/musl/glibc 中的 vsscanf 源碼。
vscanf 封裝即可,代碼不足 10 行。va_list 透傳模式:myscanf → vscanf、myprintf → vprintf、mysprintf → vsprintf。