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;
}
相关推荐
william_yangshun8 分钟前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
祖力5521 分钟前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
名字还没想好☜27 分钟前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
地平线开发者28 分钟前
【模型轻量化专题】深度学习模型为什么需要轻量化
算法
_Narcissus_1 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
Lyyaoo.1 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
threerocks1 小时前
《The AI-Native SDLC Playbook》万字拆解
算法·aigc·ai编程
Flag在我手里1 小时前
应急响应-Windows权限维持
windows·rdp·应急响应·玄机
夏玉林的学习之路2 小时前
算法8.环形队列
算法
Yyyyyy~2 小时前
【C语言】数据类型和变量【下】
c语言