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

C 語言模擬實現 printf:可變參數 va_list 解析格式化字符串

     編輯:關於C語言

C 語言模擬實現 printf:可變參數 va_list 解析格式化字符串

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 串聯可變參數、格式字符串有限狀態機解析、各類型格式化輸出。標準庫實現極其複雜(支援寬度、精度、長度修飾、區域化等),但核心骨架一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved