欢迎入群共同学习交流
时间记录: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;
}