函数形参之不定长参数列表va_lis,va_start,va_arg,va_end,vsprintf

目录

 用标准库完成不定长参数输出

整体解析:

va_start 函数

va_arg(参1,参2) 函数

va_end 函数

vsprintf函数


 用标准库完成不定长参数输出

void u3_printf(char* fmt,...) 之中有部分如下

    va_list ap;
    va_start(ap,fmt);
    vsprintf((char*)USART3_TX_BUF,fmt,ap);
    va_end(ap);

ap:一个char指针

fmt:不定长参数的最后一个,也是参数的第一个

USART3_TX_BUF:缓存数组地址;

整体解析:

          形参后面3点代表不定长参数,其中第一个fmt是最后一个传入的,堆栈原则,右边先入;

调用函数指定用到va_list类型的指针;

va_start

va_end配套使用

va_start 函数

对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身指向fmt,第二个参数是在变参表前面紧挨着的一个变量,即“…”之前的那个参数;

va_arg(参1,参2) 函数

它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;

va_end 函数

输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。

vsprintf函数

原型 int vsprintf (char * s, const char * format, va_list arg );

vsprintf((char*)USART3_TX_BUF,fmt,ap);

USART3_TX_BUF缓存;fmt 参数表第一个参;ap  当前位置;

描述:

将可变参数列表的格式化数据写入字符串
使用由arg标识的变量参数列表中的元素而不是附加函数参数,并将结果内容作为C字符串存储在s指向的缓冲区中。
在内部,函数从arg标识的列表中检索参数,就好像va_arg被使用了一样,因此arg的状态很可能被调用所改变。

sprintf函数

介绍类似的vsprintf()的函数

原型

extern _ARMABI int sprintf(char * __restrict /*s*/, const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1,2)));
   /*
    * is equivalent to fprintf, except that the argument s specifies an array
    * into which the generated output is to be written, rather than to a
    * stream. A null character is written at the end of the characters written;
    * it is not counted as part of the returned sum.
    * Returns: the number of characters written to the array, not counting the
    *          terminating null character.
    */

详解:__restrict为一个数组的指针常指针...三个点不定长参数

把常指针的字符串,并且把参数放进字符串中,然后储存在数组里面;

返回值是写入到数组中的个数;

参考链接:

C 标准库 – <stdarg.h> | 菜鸟教程

vsprintf用法解析_vsprintf_s_a1000worlds的博客-CSDN博客

va_start和va_end使用详解-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值