c语言不定参数

时间记录:2024/1/22

一、不定参数的函数定义和使用到的c函数

(1)定义

cpp 复制代码
void fun1(参数类型 argName,...);
示例:
void fun1(int count,...);

(2)获取不定参数的值

c 复制代码
#include <stdarg.h> //包含头文件

va_list vaList;//定义结构体变量
va_start(vaList,count);//开始遍历不定参数
va_arg(vaList,type);//获取一个不定参数的值,type:int整数、double小数、char*字符串
va_end(vaList);//结束遍历

二、不定参数函数示例

(1)计算int类型数据总和,计算结果为8,argName的值不是使用va_arg函数获取的

c 复制代码
#include <stdio.h>
#include <stdarg.h>

int madd(const int argName,...);

int main()
{
	printf("%d",madd(3,1,2,5));
	return 0;
}

int madd(const int argName,...)
{
	int tempNum = 0;
	
	va_list vaList;
	va_start(vaList,argName);
	
	int i;
	for(i=0;i<argName;i++){
		tempNum += va_arg(vaList,int);
	}
	
	va_end(vaList);
	
	return tempNum;
}

(2)字符串格式化拼接,输出100-21.34%-testdfs

c 复制代码
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

void mprintf(const char *format,...);

int main()
{
	mprintf("%d-%.2f%-%sdfs\n",100,21.345,"test");
	return 0;
}

void mprintf(const char *format,...)
{
	int fmtPos = 0;//原始字符串format的字符位置
	char tempStr[32];//拼接好不定参数的新字符串
	memset(tempStr,0,sizeof(tempStr));//清空数组
	int tempPos=0;//新字符串tempStr的字符位置
	
	va_list vaList;
	va_start(vaList,format);
	
	for(fmtPos=0;fmtPos<strlen(format);fmtPos++){//遍历原始字符串
		if(format[fmtPos] == '%' && format[fmtPos+1] == 'd'){//格式化输入整数
		    sprintf(tempStr,"%s%d",tempStr,va_arg(vaList,int));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(format[fmtPos] == '%' && format[fmtPos+1] == 's'){//格式化输入字符串
			sprintf(tempStr,"%s%s",tempStr,va_arg(vaList,char*));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(format[fmtPos] == '%' && format[fmtPos+1] == 'f'){//格式化输入小数,小数点后全部保留
			sprintf(tempStr,"%s%lf",tempStr,va_arg(vaList,double));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(format[fmtPos] == '%' && format[fmtPos+1] == '.' && format[fmtPos+3] == 'f'){//格式化输入小数,小数后进行保留指定位
			switch(format[fmtPos+2]){//默认6位,选择1-5位保留
				case '1':
					sprintf(tempStr,"%s%.1lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '2':
					sprintf(tempStr,"%s%.2lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '3':
					sprintf(tempStr,"%s%.3lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '4':
					sprintf(tempStr,"%s%.4lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '5':
					sprintf(tempStr,"%s%.5lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				default:
					sprintf(tempStr,"%s%lf",tempStr,va_arg(vaList,double));
				    tempPos = strlen(tempStr);
				    fmtPos+=3;
					break;
			}
		}else{
			tempStr[tempPos] = format[fmtPos];
			tempPos++;
		}
	}
	
	va_end(vaList);
	printf("%s",tempStr);
	return;
}
相关推荐
Wect28 分钟前
LeetCode 39. 组合总和:DFS回溯解法详解
前端·算法·typescript
Wect31 分钟前
LeetCode 46. 全排列:深度解析+代码拆解
前端·算法·typescript
颜酱33 分钟前
Dijkstra 算法:从 BFS 到带权最短路径
javascript·后端·算法
木心月转码ing3 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴3 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困6 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub9 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
程序设计实验室11 小时前
在 Windows 11 上使用 Hyper-V 虚拟机准备安装OpenClaw
windows