模拟实现printf
一:printf函数介绍
printf是格式化的输出函数。
举个例子:
1. 想输出> a
2. 想输出>a,b
3. 想输出>a,b,c
printf("%c",a);
printf("%c%c",a,b);
printf("%c%c%c",a,b,c);
可以看出printf参数的个数是不确定的。
那printf到底是怎样实现的呢?
二:利用可变参数模拟实现printf
利用stdarg宏来解决可变参数问题
头文件#include < stdarg.h >
几个重要的知识点:
- va _list arg 声明一个 char* 的变量arg,用于访问参数列表未确定的部分。
- va_ start(arg,num) 它的第一个参数为arg,第二个参数为省略号前最后一个有名字的参数。它的作用是将arg指向第一个未知参数的部分;参数列表中必须有一个需要知道名字,否则无法运用va _start 。
- va_arg(arg,int) 它的第一个参数是arg,第二个参数为下一个参数的类型。使用这条语句,读出arg指向的值并将arg移动到下一个参数上。
- va_end(arg) 访问完毕时使用。
三:代码块
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
void num(r)
{
if (r / 10 == 0)
{
putchar(r%10+'0');
}
else
{
num(r / 10);
putchar(r % 10+'0');
}
}
void str(char *r)
{
while(*r)
{
putchar(*r);
r++;
}
}
void print(char *format, ...)
{
va_list arg; //定义一个char* 类型的变量
va_start( arg, format); //使arg指向第一个未知参数
while (*format)
{
if (*format != '%')
{
putchar(*format); //如果不是%则原样输出
}
else if (*format == '%') //如果遇到%,则观察%下一个字符是什么
{
format++;
switch (*format)
{
case 'c': //如果是字符,直接打印
putchar(va_arg(arg,int));
break;
case 'd':
{ // 若为整形数,则递归转为字符打印
int r = va_arg(arg, int);
num(r);
}
break;
case 's':
{ // 若为字符串,则循环打印
char* r = va_arg(arg, char*);
str(r);
}
break;
}
}
format++;
}
}
int main()
{
print("45%s **&%c%c%c123 %d\n", "hello", 'c', 'a', 't',12345);
system("pause");
return 0;
}