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

C语言之利用可变参数列表实现简易的printf

程序员文章站 2022-07-14 08:09:38
...

在最初接触C语言的时候就接触到 printf( ) 这个函数,当时并没有对此留心与研究,也没有发现这个函数跟其他普通函数存在区别,普通函数的参数在函数定义的时候就确定了,而 printf ( ) 函数的参数列表在调用时可以变化。所以再学习与了解可变参数列表以后,便利用可变参数列表实现了一个简易的 printf( ) 。
其代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void printf_int(int n)//看似打印的是数字, 其实是一个个字符
{
    if (n > 9)
    {
        printf_int(n / 10);//利用递归的思路来将一个数字各个位数分离开来。
    }
    putchar((n % 10) + '0');//利用 '0' 加上数字所代表的字符代替想要打印的数字。
}

int my_printf(const char *format, ...)//printf函数的返回值其实是在屏幕上所打印东西的个数,所以返回值是 int。
{
    va_list list;
    va_start(list, format);

    char *p = format;
    while (*p != '\0')
    {
        if (*p == '%')
        {
            p++;
            switch (*p)
            {
            case 'd'://%d,即为整型
            {
                        int data = va_arg(list, int);
                        printf_int(data);//在打印整型数字时,发现并没有好的方法能对数字打印,于是便写了个打印数字的函数。
            }
                break;
            case 'c'://%c,即为字符类型
            {
                        char ch = va_arg(list, char);
                        putchar(ch); 
            }
                break;
            case 's'://%s,字符串
            {
                        char *cp = va_arg(list, char*);
                        while (*cp)
                        {
                            putchar(*cp);
                            cp++;
                        }
            }
                break;
            default:
                break;
            }
        }
        else
            putchar(*p);
        p++;
    }

    va_end(list);
}

int main()
{
    int a = 10;
    char ch = 'a';
    char *str = "hello china!";

    printf("printf result is : %d %c %s\n", a, ch, str);//这里的printf作为比较,与自己实现的进行对比。
    my_printf("my_printf result is : %d %c %s\n", a, ch, str);

    system("pause");
    return 0;
}

C语言之利用可变参数列表实现简易的printf

运行结果显示与printf的一致,简易的 printf( ) 函数就此实现,由于是简易的实现,所以仅仅只对 %d、%c、%s 进行了实现。

欢迎大家共同探讨研究,如果错误,请及时联系作者进行修改更正,谢谢大家!