0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言可变形参是什么

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-08-18 21:40 次阅读

C语言可变形参

  C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。

1.可变形参相关函数

#include 
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

 va_start完成ap指针初始化,以供va_arg和va_end后续使用,该函数必须先调用。参数last是变量参数列表前最后一个参数的名称;
va_arg实现下一个参数的类型和值的获取。参数ap是由va_start初始化的参数列表。对va_arg()的每次调用都会修改ap,以便获取下一个参数。参数类型type是一个指定的数据类型。
va_end将ap指向NULL。
va_copy将参数列表src复制到dest中,该函数在c99才有定义。

2.可变形参模仿printf函数

#include 
#include 
void my_printf(const char *fmt,...);
int main()
{
	my_printf("%s\n","123456");
	my_printf("%d %%\n",55);
	my_printf("%f\n",789.56);
	my_printf("%c\n",'c');
	my_printf("%ld,%lf\n",1234567890123,45.789625);
}
void my_printf(const char *fmt,...)
{
	va_list ap;
	va_start(ap,fmt);//ap=fmt
	char c,*s;
	int d;
	float f;
	long l;
	double b;
	while(*fmt)
	{
		if(*fmt!='%')
		{
			putchar(*fmt);//输出%前所有字符
		}
		else 
		{
			fmt++;//跳过%
			switch(*fmt)
			{
				case 'c'://字符
					c=(char )va_arg(ap,int);//字符存储时按int空间处理
					fprintf(stdout,"%c",c);
					break;
				case 'd'://整数
					d=va_arg(ap,int);
					fprintf(stdout,"%d",d);
					break;
				case 'f'://浮点数
					f=(float)va_arg(ap,double);//浮点数据处理时按double处理
					fprintf(stdout,"%f",f);
					break;
				case '%'://%%
					putchar(*fmt);
					break;
				case 's'://字符串
					s=va_arg(ap,char *);
					fprintf(stdout,"%s",s);
					break;
				case 'l':
					fmt++;
					if(*fmt=='d')//长整形%ld
					{
						l=va_arg(ap,long);
						fprintf(stdout,"%ld",l);
					}
					else if(*fmt=='f')//双精度浮点型%lf
					{
						b=va_arg(ap,double);
						fprintf(stdout,"%lf",b);
					}
					break;
			}
		}
		fmt++;
	}
	va_end(ap);//ap=NULL
}

  运行效果:

[wbyq@wbyq 0414work]$ gcc main.c 
[wbyq@wbyq 0414work]$ ./a.out 
123456
55 %
789.559998
c
1234567890123,45.789625

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7622

    浏览量

    139035
收藏 人收藏

    相关推荐

    电压放大器在可变形机翼缩比模型主动变形实验中的应用

    实验名称:可变形机翼缩比模型主动变形实验验证研究方向:介绍了可用于低速风洞实验要求的可变形缩比模型的设计方案,以及粘接MFC致动器之后,可变形机翼缩比模型在1500V电压驱动下的主动
    的头像 发表于 09-30 14:45 1802次阅读
    电压放大器在<b class='flag-5'>可变形</b>机翼缩比模型主动<b class='flag-5'>变形</b>实验中的应用

    C语言——可变参数问题.

    ;The value is %d!\n", value);  这种可变参数可以说是C语言一个比较难理解的部分,这里会由几个问题引发一些对它的分析。   注意:在C++中有函数重载(ov
    发表于 04-20 15:17

    C语言可变参数的定义

    C语言可变参数的定义。//可变参数用...来表示void TRACE(char *format, ...)(2)可变参数函数需要用到的宏
    发表于 07-14 07:43

    怎么设计c语言可变长参数函数?

    怎么设计c语言可变长参数函数
    发表于 10-27 07:10

    可变形电池正在研发,弯曲手机更近了

    日前韩国科学家发表了论文,称“世界上首款”可变形锂电池的研发工作非常顺利,这款产品的性能已经相对稳定。该产品的研发为今后可变形手机的到来奠定了基础。根据韩国联合通
    发表于 01-16 10:10 815次阅读

    基于稀疏表示的可变形部件模型目标检测

    基于可变形部件模型DPM的目标检测算法采用方向梯度直方图HOG进行特征表示,由于HOG无法处理模糊的边界而且忽略了平滑的特征区域,从而影响了DPM算法的性能。为了提高DPM的性能,提出了一种基于稀疏
    发表于 11-21 16:52 11次下载

    融合分支定界的可变形部件模型的行人检测

    针对可变形部件模型(DPM)算法在行人检测领域中的检测精度高,但由于在特征提取和行人定位两步中的计算量过大,导致检测速度过慢而不能应用于实时行人检测的问题,提出了一种融合分支定界算法和级联
    发表于 11-30 15:52 0次下载

    基于可变形卷积网络的恒星大气物理参数检测

    基于可变形卷积网络的恒星大气物理参数检测
    发表于 06-18 14:53 15次下载

    基于可变形卷积网络的恒星大气物理参数测量

    基于可变形卷积网络的恒星大气物理参数测量
    发表于 07-02 16:07 14次下载

    C语言-函数的定义、声明、传

    C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用子函数完成各个逻辑功能。 这篇文章作为C
    的头像 发表于 08-14 09:57 2104次阅读

    C语言-函数的可变形(不定形)

    这篇文章介绍C语言函数的不定参数、可变参数 形,实现printf一样的传效果。
    的头像 发表于 08-14 09:58 2902次阅读

    C语言-指针作为函数形类型

    C语言函数里最常用就是指针传和返回地址,特别是字符串处理中,经常需要封装各种功能函数完成数据处理。
    的头像 发表于 08-14 10:05 2058次阅读

    C语言可变参数的使用详解

    c/c++语言具备一个不同于其他编程语言的的特性,即支持可变参数。
    的头像 发表于 03-08 09:47 1772次阅读

    C语言函数参数介绍

    C语言数组元素作函数实参 数组元素可以用作函数实参,不能用作形C语言在用数组元素作函数实参时,把实参的值传给形
    的头像 发表于 03-10 14:30 2602次阅读

    C语言中的可变参数介绍

    C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数
    发表于 02-28 14:00 408次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的<b class='flag-5'>可变</b>参数介绍