模拟实现printf

模拟实现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;
}

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/80259990