c语言不定参数

时间记录:2024/1/22

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

(1)定义

void fun1(参数类型 argName,...);
示例:
void fun1(int count,...);

(2)获取不定参数的值

#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函数获取的

#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

#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;
}

相关推荐

  1. c语言参数

    2024-01-25 01:46:01       37 阅读
  2. C++11数量参数模板

    2024-01-25 01:46:01       10 阅读
  3. C语言】命令行参数

    2024-01-25 01:46:01       12 阅读
  4. SpringMVC参数

    2024-01-25 01:46:01       14 阅读
  5. c语言中指针作函数参数

    2024-01-25 01:46:01       37 阅读

最近更新

  1. MacOS隐藏文件打开指南

    2024-01-25 01:46:01       0 阅读
  2. 基于go 1.19的站点模板爬虫

    2024-01-25 01:46:01       1 阅读
  3. Pandas在生物信息学中的应用详解

    2024-01-25 01:46:01       1 阅读
  4. DOM XMLHttpRequest

    2024-01-25 01:46:01       1 阅读

热门阅读

  1. GO——recover

    2024-01-25 01:46:01       32 阅读
  2. 解决Milo连接OPU UA报错的两个常见报错

    2024-01-25 01:46:01       38 阅读
  3. 开发安全之:Server-Side Request Forgery

    2024-01-25 01:46:01       32 阅读
  4. 动态规划最后一天(回文串)

    2024-01-25 01:46:01       39 阅读
  5. 【力扣每日一题】力扣2765最长交替子数组

    2024-01-25 01:46:01       47 阅读
  6. python基础——进程

    2024-01-25 01:46:01       39 阅读
  7. WPF关键帧动画

    2024-01-25 01:46:01       44 阅读
  8. 75.实现统一异常处理和封装统一返回结果

    2024-01-25 01:46:01       37 阅读