用可變引數列表實現簡單的printf函式
阿新 • • 發佈:2019-01-27
#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這幾個巨集又不懂的可以參照上上篇部落格哦)