并没有完全实现
目前只实现:%d %s %c %f(double)
代码如下:
#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]);
}