利用可变参数列表简单实现printf函数的功能
利用可变参数来实现输出函数,有两点必须已知:
第一,需知输出参数的个数,这个 可以通过可变参数列表的第一个参数可知。
第二,需知各输出参数的类型,这个也可以通过可变参数列表的第一个参数可知。
例如:实现输出:hello world! 100
则传参时,可将hello看做一字符串,world看做5个字符,!原样输出,100为整数输出,即可表示为:
myprintf("%s %c%c%c%c%c! %d","hello",'w','o','r','l','d',100);
此时,第一个参数中可根据“%”的个数以及原样输出的字符串个数来显示输出参数的总个数;
可根据“%”后的字符不同表示不同类型的参数。
代码如下:
引入头文件:
首先是主函数传参:
然后是myprintf函数:
首先定义可变参数的几个宏:因为myprintf函数的第一个参数是字符串类型,所以用字符指针接收
此时,arg指向可变参数列表的第二个参数
然后分析第一参数中的各字符:
当遇到%时,读取%后的下一个字符,若为“s”,“c”,“d”中的任一个,则进行字符串,字符,整数的输出
若没有遇到%,而遇到其他字符,则原样输出其他字符,代码如下:
另外,在对整型输出时,还可以运用递归实现,比如,整数1234,输出为1,2,3,4,在4输出之前先输出123,
在输出3之前,先输出12,在输出2之前,先输出1。当要输出的数小于10时,可直接输出。
上述"%d"部分的代码可替换如下:
运行结果如下: