c语言实现可变参数函数va_arg,va_start,va_end

可变参数函数的实现:
1、 #include <stdarg.h>  //使用 va_list va_start 等必须包含的头文件;
 2、void va_start(va_list ap, last);//va_start用于获取函数参数列表中可变参数的首指针(获取函数可变参数列表),根据fmt将fmt后面的具体参数让args指向;
 3、type va_arg(va_list ap, type);//关键函数:va_arg用于获取当前args所指的fmt后面的具体可变参数,并将并将args指针移向下一可变参数
       void va_end(va_list ap);//有va_start,当然也有va_end

具体实现一个my_printf函数代码如下:

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

#include <stdarg.h> //使用 va_list va_start 等必须包含的头文件

//还的手写itoa
char *itoa(int i, char* str)
{
    sprintf(str, "%d", i);
    return str;
}

void my_printf(const char *fmt, ...)
{
    char str[100];
    unsigned int len, i, index;
    int iTemp;
    char *strTemp;
    va_list args;//可变参数函数的格式化的list

    va_start(args, fmt);
    len = strlen(fmt);
    for(i = 0, index = 0; i < len; i++)
    {
        if(fmt[i] != '%')
        {
            str[index++] = fmt[i];
        }
        else
        {
            switch(fmt[i+1])
            {
                case 'd':
                case 'D':
                    iTemp = va_arg(args, int);//关键函数:va_arg用于获取当前args所指的可变参数并将并将args指针移向下一可变参数
                    strTemp = itoa(iTemp, str+index);
                    index += strlen(strTemp);
                    i++;
                    break;
                case 's':
                case 'S':
                    strTemp = va_arg(args, char*);
                    strcpy(str+index, strTemp);
                    index += strlen(strTemp);
                    i++;
                    break;
                default:
                    str[index++] = fmt[i];
            }
        }
    }
    str[index] = '\0';
    va_end(args);//有va_start,当然也有va_end

    printf("%s", str);
    return ;
}


int main(int argc, char* argv[])
{
    my_printf("%s-%d-%d-%s\n", "ceshi", 10, 2, "cehsi2");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值