一、printf函數介紹
printf功能
printf函數是格式化輸出函數,一般用於向標准輸出設備按規定格式輸出信息。
printf原型
int printf( const char* format , [argument] ... ); //定義在stdio.h中
以上部分來自於高小調博客(一個UI非常好,沒有廣告,純綠色的博客,建議大家收藏)
二、利用可變參數列表模擬實現printf
1.分析printf函數
printf("Hello haohaosong!\n");
printf("%s","Welcome to my bolg\n");
printf("hell%c\n",'o');
我們發現,printf函數的參數是不確定的
傳參的地方必須使用其他東西
2.解決方法
利用stdarg宏來解決可變參數問題
頭文件:<stdarg.h>
va_list;
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr, prev_param ); (ANSI version)
在VC6.0下,我們轉到定義出,可以清晰發現這些宏的定義:
分析
va_list 是用宏定義的標識符,是指向字符類型的指針
va_start(ap,v) 取出va_list 定義的變量的地址,並加上可變元素的數目
va_arg(ap,t) 每次取指針指向的內容,並在宏的內部將指針后移
va_end(ap) 將原指針指向空,以防止野指針的出現
三、具體代碼
代碼塊:
#include<stdio.h> #include<stdarg.h> int my_printf(char* str,...) { va_list arg;//定義char* 變量 arg int count = 0; char* str_tmp = NULL; va_start(arg,str);//為arg進行初始化 while(*str != '\0') { switch(*str) { case 'c': putchar(va_arg(arg,int));//取下一個參數的字符,並打印 count++; break; case 's': str_tmp = (char*)va_arg(arg,int);//取下一個參數的地址,因為這個是字符串 while(*str_tmp != '\0')//利用解引用進行輸出 { putchar(*str_tmp); count++; str_tmp++; } break; default: putchar(*str); //不為'c'或's',那么直接將它打印 count++; break; } str++; } va_end(arg);//將arg指向空,防止野指針 return count; } int main() { my_printf("s ccc","hello",'H','h','s'); return 0; }