首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言可變參數實現簡易 scanf 函數封裝

     編輯:關於C語言

核心思路

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

進階:無標準庫環境下的完整實現

若需從零實現(如內核、嵌入式),需:

  1. 實現字符輸入源(getchar/UART/鍵盤驅動)。
  2. 編寫格式字符串解析器(同 vprintf 邏輯)。
  3. 對每個格式符,調用對應解析函數(scan_int、scan_string 等),從輸入流讀取、跳過空白、轉換、寫入 va_arg 給出的地址。
  4. 處理寬度、長度修飾符、錯誤返回(EOF/匹配失敗)。

這實際上是構建一個**掃描器**,複雜度遠高於 printf。工程中極少自行實現完整 scanf,通常移植 newlib/musl/glibc 中的 vsscanf 源碼。

總結

  • 用戶態程序直接調用 vscanf 封裝即可,代碼不足 10 行。
  • 理解 va_list 透傳模式:myscanf → vscanf、myprintf → vprintf、mysprintf → vsprintf。
  • 裸機環境建議移植成熟 C 庫掃描器源碼,勿重複造輪子。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved