以下代码实现了%d、 %s的打印
#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
unsigned int rev_num(int n, unsigned int *temp)
{
unsigned int digit = 0;
*temp = 0;
do
{
*temp = *temp * 10 + n % 10;
n /= 10;
++digit;
} while (n);
return digit;
}
int output_num(int n, unsigned int digit)
{
int cnt = 0;
while (digit--)
{
putchar(n % 10 + '0'), ++cnt;
n /= 10;
}
return cnt;
}
int my_printf(const char *frm, ...)
{
int cnt = 0;
unsigned int x;
int xx;
int temp;
int digit = 0;
va_list arg;
va_start(arg, frm);
#define PUTC(a) \
{ \
putchar(a); \
++cnt; \
}
for (int i = 0; frm[i]; i++)
{
switch (frm[i])
{
case '%':
{
switch (frm[++i])
{
case '%':
PUTC(frm[++i]);
break;
case 'd':
{
xx = va_arg(arg, int);
temp = 0;
if (x < 0)
{
PUTC('-');
x = (-xx);
}
else
{
x = xx;
}
unsigned int temp1, temp2;
unsigned int x1 = x / 100000;
unsigned int x2 = x % 100000;
unsigned int digit1 = rev_num(x1, &temp1);
unsigned int digit2 = rev_num(x2, &temp2);
if (x1)
digit2 = 5;
else
digit1 = 0;
cnt += output_num(temp1, digit1);
cnt += output_num(temp2, digit2);
break;
}
case 's':
{
const char *str = va_arg(arg, const char *);
for (int i = 0; str[i]; i++)
{
PUTC(str[i]);
}
break;
}
}
break;
}
default:
{
PUTC(frm[i]);
break;
}
}
}
#undef PUTC
va_end(arg);
return cnt;
}
int main()
{
printf("hello world\n");
my_printf("hello world\n");
printf("int(123) = %d\n", 123);
my_printf("int(123) = %d\n", 123);
printf("int(0) = %d\n", 0);
my_printf("int(0) = %d\n", 0);
printf("int(-123) = %d\n", -123);
my_printf("int(-123) = %d\n", -123);
printf("int(1000) = %d\n", 1000);
my_printf("int(1000) = %d\n", 1000);
printf("INT32_MAX = %d\n", INT32_MAX);
my_printf("INT32_MAX = %d\n", INT32_MAX);
printf("INT32_MIN = %d\n", INT32_MIN);
my_printf("INT32_MIN = %d\n", INT32_MIN);
printf("%s", "I love china\n");
my_printf("%s\n", "I love china");
return 0;
}