【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;
}

运行结果:

posted @ 2016-10-23 16:47  C/C++专题  阅读(4491)  评论(0编辑  收藏  举报