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;
}
相关推荐
算法备案代理31 分钟前
宽带自动连接保姆级教程
算法
罗超驿33 分钟前
双指针算法详解:从入门到精通(Java版)
算法·leetcode·职场和发展
m0_3770629236 分钟前
电池电量计库伦算法计算公式
算法
崖边看雾36 分钟前
记录Python学习——第一章环境安装下载(Windows)
windows·python·学习·pycharm
patrickpdx39 分钟前
高联预赛中的高斯函数问题
算法
tkevinjd1 小时前
力扣300-最长递增子序列
算法·leetcode·职场和发展·动态规划·贪心
CS创新实验室1 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy
小李飞刀李寻欢2 小时前
DeepSeek V3 版本模型结构分析
算法·大模型·deepseek
某不知名網友2 小时前
C++ 七大排序算法完整讲解
java·算法·排序算法
sukalot2 小时前
windows网络适配器驱动开发-NetAdapterCx 接收端缩放(中)
windows·驱动开发