标题 ##模拟实现printf函数,可完成下面的功能
//
//能完成下面函数的调用。
//print(“s ccc d.
”,”hello”,’b’,’i’,’t’,100);
//函数原型:
//print(char *format, …)
//
1.认识一下printf:
在构建printf()函数之前,需要简单分析printf(),在帮助文档中可以看到,printf()的格式为printf (char * format,…)
2.需要了解这些参数是如何在内存中存储的。从这个栈桢结构图中可以看到print()函数的参数的存放方式,print()中的参数在形成临时变量时是从右往左的,这也就可以解释为什么只传入 char * format 就可以定位后面的不可变参数部分,char* format 作为左后一个传入的参数,可以方便的取出它的地址,那么下一个类型的地址就是第二个参数的地址
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
# include
int print(char *s, ...)
{
int i = 0;
va_list str;
va_start(str, s);
char* ch = s;
int a = va_arg(str, char);
while (*ch)
{
if (*ch == 's')
{
char *put = *(&s + 1);
while (*put)
{
putchar(*(put));
put++;
}
}
else if (*ch == 'c')
{
putchar(va_arg(str, char));
}
else if (*ch == 'd')
{
int a = va_arg(str, char);
int arr[20] = { 0 };
int cou = 0;
int tmp = a;
while (a > 9)
{
tmp = a % 10;
a = a / 10;
cou++;
arr[cou] = tmp;
arr[cou] = tmp;
}
arr[cou] = a;
while (cou)
{
putchar(arr[cou] + 48);
cou--;
}
putchar(arr[cou] + 48);
}
else
{
putchar(*ch);
}
ch++;
}
}
int main()
{
print("s ccc d
", "hello", 'b', 'i', 't', 100);
print("s
","你好bit
");
system("pause");
return 0;
}
输出结果为
另一种:
#define _CRT_SECURE_NO_WARNINGS 1
#include
# include
# include
# include
void print_num(int x)
{
if (x > 9)
{
print_num(x / 10);
}
putchar(x % 10 + '0');
}
int nprint(const char * format, ...)
{
va_list args;
va_start(args, format);
char * pr = format;
while (*pr)
{
switch (*pr)
{
case '%':
{
switch (*(++pr))
{
case 's':
{
char * str = va_arg(args, char*);
while (*str)
{
putchar(*str);
str++;
}
}
break;
case'c':
{
putchar(va_arg(args, char));
}
break;
case'd':
{
print_num(va_arg(args, int));
}
break;
default:
{
putchar(*(pr - 1));
putchar(*pr);
}
break;
}
}
break;
default:
{
putchar(*pr);
}
break;
}
pr++;
}
va_end(args);
return 0;
}
int main()
{
nprint("%q%w%e%r%t测试一下会不会有其他%的
%s %c%c%c %d
", "hello ", 'b', 'i', 't', 100);
system("pause");
return 0;
}