C语言 自定义一个函数实现printf功能,只导入stdio头文件
2023-03-14
不得不说,之前没有注意到参数的传递是链式的,函数传参的所有参数是一个接着一个放在一起的
#include "stdio.h" //获取字符串长度 int strlen(char * ret) { int i = 0; while (true) { if (*(ret + i) == '\0') { break; } else { i += 1; } } return i; } void printfd(void * addr);//输出 int void printfc(void * addr);//输出 char void printfs(void * addr);//输出 char * (str 、 string) void printff(void * addr);//输出 float (double > float so use double will be better) //定义myprintf int myprintf(char * ret, ...) { void * addr = &ret; int length = strlen(ret), xnum = 0; char * retdemo = ret; //获取需要打印的参数数量 for (int i = 0; i <length; i++) { char demo = *retdemo; if (demo == '%') xnum++; retdemo++; } //对所需打印参数进行整理 int pian = 0, xnumi = 0; retdemo = ret; for (int i = 0; i <length; i++) { char demo = *retdemo; if (demo == '%') { char mei = *(retdemo + 1); if (mei == 'd') { pian++; addr = &ret + pian; printfd(addr); xnumi++; } else if (mei == 's') { pian++; addr = &ret + pian; printfs(addr); xnumi++; } else if (mei == 'c') { pian++; addr = &ret + pian; printfc(addr); xnumi++; } else if (mei == 'f') { pian = pian + 1; addr = &ret + pian; printff(addr); xnumi++; } } else if (demo != '%' && *(retdemo - 1) != '%') putchar(demo); retdemo++; } return 0; } int main() { myprintf("int:%d char:%c string:%s float:%f", 887,'a',"myprintf!",15.3); while (true); } //输出 int void printfd(void * addr) { int result = *(int *)addr, wei = 10, weishu = 0, all[99]; while (true) { int yushu = result % wei; if (yushu != result) { wei = wei * 10; weishu++; } else { weishu++; break; } } int i = 0; for (; i < weishu; i++) { int yushu = result % 10; result = result / 10; all[i] = yushu; } all[i] = 10; for (size_t j = 0; all[j] != 10; j++) putchar(all[i - j - 1] + '0'); } //输出 char void printfc(void * addr) { putchar(*(char*)addr); } //输出 str void printfs(void * addr) { char * demo = *(char**)addr; for (int i = 0; i < strlen(demo); i++) putchar(*(demo + i)); } //输出 float (double > float so use double will be better) void printff(void * addr) { double result = *(double *)addr; char strdouble[99]; double ret = result; int zheng = (int)result,zweishu=0,wei = 10,xweishu=0; while (true) { int yushu = zheng % wei; if (yushu == zheng) { zweishu++; break; } else { zweishu++; wei = wei * 10; } } for (int i = 0; i < zweishu; i++) { int yushu = zheng % 10; zheng = zheng / 10; strdouble[zweishu - i - 1] = yushu + '0'; } strdouble[zweishu] = '.'; while (true) { if ((int)ret != ret) { ret = ret * 10; xweishu++; } else break; } for (int i = 0; i < xweishu; i++) { int yushu = (int)ret % 10; ret = ret / 10; strdouble[zweishu + xweishu - i ] = yushu + '0'; } strdouble[zweishu + xweishu +1] = '\0'; for (int i = 0; i < strlen(strdouble); i++) putchar(strdouble[i]); }
看效果图
发表评论: