【C語言】模擬實現printf函數(可變參數)


一、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;
}

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM