欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用可变参数列表实现简单的printf函数

程序员文章站 2022-06-03 13:15:03
...
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdarg.h>
void print_num(int n)
{
    if (n > 9)
        print_num(n / 10);
    putchar(n % 10+'0');
}
void print(char* format, ...)
{
    va_list arg;
    va_start(arg, format);
    while (*format)
    {
        switch (*format)
        {
        case 's':
        {
                char *str = va_arg(arg, char *);
                while (*str)
                {
                    putchar(*str);
                    str++;
                }
        }
            break;
        case 'c':
            putchar(va_arg(arg, char));
            break;
        case 'd':
            print_num(va_arg(arg, int));
            break;
        default:
            putchar(*format);
            break;
        }
        format++;
    }
    va_end(arg);
}
int main()
{
    print("s ccc d.\n", "hello", 'b', 'i', 't',100);
    system("pause");
    return 0;
}

在执行此函数时,函数在栈帧中如下图所示存储:
用可变参数列表实现简单的printf函数
在调用print函数是先将“s ccc d.\n”这个字符串首字符地址传过去,根据此地址用va_arg找到下面几个内存块中的内容。
在打印整形数字100时,由于putchar输出的是字符所以在所要输出的数字后面加上‘0’(字符0);打印字符串时需要用putchar而不用puts,因为puts输出一行后自动换行。
注意:在使用va_arg时,所传类型与相对应的内存块中存储的数据类型一致!
(关于va_list,va_start,va_arg,va_end这几个宏又不懂的可以参照上上篇博客哦)

相关标签: 函数 printf