利用可变参数列表简单实现printf函数的功能

利用可变参数来实现输出函数,有两点必须已知:

第一,需知输出参数的个数,这个 可以通过可变参数列表的第一个参数可知。

第二,需知各输出参数的类型,这个也可以通过可变参数列表的第一个参数可知。

例如:实现输出:hello world! 100

则传参时,可将hello看做一字符串,world看做5个字符,!原样输出,100为整数输出,即可表示为:

myprintf("%s %c%c%c%c%c! %d","hello",'w','o','r','l','d',100);

此时,第一个参数中可根据“%”的个数以及原样输出的字符串个数来显示输出参数的总个数;

         可根据“%”后的字符不同表示不同类型的参数。

代码如下:

引入头文件:

利用可变参数列表简单实现printf函数的功能

首先是主函数传参:

利用可变参数列表简单实现printf函数的功能

利用可变参数列表简单实现printf函数的功能然后是myprintf函数:

首先定义可变参数的几个宏:因为myprintf函数的第一个参数是字符串类型,所以用字符指针接收

利用可变参数列表简单实现printf函数的功能

此时,arg指向可变参数列表的第二个参数

然后分析第一参数中的各字符:

当遇到%时,读取%后的下一个字符,若为“s”,“c”,“d”中的任一个,则进行字符串,字符,整数的输出

若没有遇到%,而遇到其他字符,则原样输出其他字符,代码如下:

利用可变参数列表简单实现printf函数的功能

利用可变参数列表简单实现printf函数的功能

利用可变参数列表简单实现printf函数的功能

另外,在对整型输出时,还可以运用递归实现,比如,整数1234,输出为1,2,3,4,在4输出之前先输出123,

在输出3之前,先输出12,在输出2之前,先输出1。当要输出的数小于10时,可直接输出。

上述"%d"部分的代码可替换如下:

利用可变参数列表简单实现printf函数的功能


利用可变参数列表简单实现printf函数的功能

运行结果如下:

利用可变参数列表简单实现printf函数的功能