1. 程式人生 > >用可變引數列表實現簡單的printf函式

用可變引數列表實現簡單的printf函式

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdarg.h>
void print_num(int n)
{
    if (n > 9)
        print_num(n / 10);
    putchar(n % 10+'0');
}
void print(char* format, ...)
{
    va_list arg;
    va_start(arg, format);
    while (*format)
    {
        switch
(*format) { case 's': { char *str = va_arg(arg, char *); while (*str) { putchar(*str); str++; } } break; case 'c': putchar(va_arg(arg, char
)); break; case 'd': print_num(va_arg(arg, int)); break; default: putchar(*format); break; } format++; } va_end(arg); } int main() { print("s ccc d.\n", "hello", 'b', 'i', 't',100); system("pause"
); return 0; }

在執行此函式時,函式在棧幀中如下圖所示儲存:
這裡寫圖片描述
在呼叫print函式是先將“s ccc d.\n”這個字串首字元地址傳過去,根據此地址用va_arg找到下面幾個記憶體塊中的內容。
在列印整形數字100時,由於putchar輸出的是字元所以在所要輸出的數字後面加上‘0’(字元0);列印字串時需要用putchar而不用puts,因為puts輸出一行後自動換行。
注意:在使用va_arg時,所傳型別與相對應的記憶體塊中儲存的資料型別一致!
(關於va_list,va_start,va_arg,va_end這幾個巨集又不懂的可以參照上上篇部落格哦)