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

C 語言模擬 printf 進階:支援 %d/%c/%s、轉義字符、格式字符串解析

     編輯:關於C語言

C 語言模擬 printf 進階:支援 %d/%c/%s、轉義字符、格式字符串解析

在上一版基礎上,增加對格式字符串中轉義字符(\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 參數串聯、各類型格式化輸出。此版本展示核心骨架,工程級實現需處理極其龐大的邊界情況。

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