为什么说只能实现简版的printf,因为其中涉及到很多优化要做,比如存储,数据结构,输出色彩等等,,该文档仅设计%d部分。也没有做的完善,类似%d02,等都没做,就一个设计思路吧,也是变参函数的应用,关于%c,%f,%s详见文档(二)
总体思路:
1、先实现,格式化打印一串字符,利用putchar
2、如何实现打印参数的值,利用变参函数,获取后一个变量
因为变量有不同的类型,所以我们先解析是何种变量
3、记录打印的次数(融合与1、2中)
4、不断试错中优化代码
让我们一起一步一步的来实现吧
功能1:能够打印一个完整的字符串
下面我们基于putchar()来实现我们的my_printf,以printf做对比
过程一代码如下:
#include<stdio.h>
//在const在前,frm内的值为常量,地址允许改变,值不允许改变
int my_printf(const char *frm,...) {
//接收一个字符串
int cnt = 0; //记录打印的字符个数
for(int i = 0; frm[i]; i++) {
//字符串末尾\0 对应的值为0 即为即假,遍历到末尾自然
putchar(frm[i]),++cnt;
}
return cnt;
}
int main() {
printf("hello word\n");
my_printf("hello word\n");
return 0;
}
程序的功能实现就是原有的基础上叠加代码,而printf最牛的地方就是能够打印变量的值,这里就要借助变参函数的能力了
功能2:打印变量的值
过程二:思路:首先要对字符串进行解析,遇到%,%d,%c等,代码有限,只解析%d的内容,
->以实现打印整型123为目标
主函数
int main() {
int a = 123;
printf("hello word\n");
my_printf("hello word\n");
printf("int (a) =%d\n",a);
my_printf("int (a) =%d\n",a);
return 0;
}
打印结果:
是不是有点样子了,下面我们进行第三步,因为数据的不确定性,我们要多种试错,带进行调试
过程三:调整与试错
1数据翻转
::首先因为数据的位数无法确定,所以我们采用数据从末尾开始打印的方法,也导致数据与原数据的颠倒,所以我们要先将数据翻转再打印
修改:
case 'd' : {
//因为无法实现整形一起打出,故只能一位一位的以字符形式输出
int x = va_arg(arg, int);
int temp = 0;
while(x){
temp = temp*10 + x %