C语言可变参数/不定参函数

发布于:2025-03-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

一:不定参宏函数

#define LOG(fmt,...) printf("[%s,%d]"fmt,__FILE__,__LINE__,##__VA_ARGS__);
//##是允许你不用%s,我注释的那句就是没有##的写法
int main(){
    printf("[%s,%d]:%s,%d\n",__FILE__,__LINE__,"加油",666);
    //LOG("%s","你好");
	LOG("你好");


	return 0;
}

二:单一类型不定参

va_list那几句是套路,记住就好了。中间是处理,按具体情况来


#include<stdio.h>
 #include <stdarg.h>
  
//C语言版不定参数

//应对单类型
void printNum(int n,...) //n是几个参数的意思
{
	va_list ap;
	va_start(ap,n);//让ap指向n之后的第一个可变参数
	for(int i=0;i<n;i++)
	{
		int num=va_arg(ap,int);//从可变参数中取出一个整形
		printf("%d",num);
	}
	printf("\n");
	va_end(ap);
}
int main(){
  
   printNum(2,1,2);
   
   printNum(3,1,2,3);

	return 0;
}

三:多类型不定参

vasprintf 它可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。其存储在一个指向字符数组的指针中。


#include<stdio.h>
 #include <stdarg.h>
   #include <stdlib.h>
//C语言版不定参数

//应对多类型
void myprint(const char* fmt,...)
{
 va_list ap;
va_start(ap,fmt);

char* res;
int ret=vasprintf(&res,fmt,ap);//用于处理传不同类型的
if(ret!=-1) {
	printf(res);
	free(res);//不能忘 这是用vasprintf的必要要求
	
}
va_end(ap);
}
int main(){
  
  myprint("%s\n","你好");
 myprint("%s%s\n","你好","加油");
 myprint("%s%s%d\n","你好","加油",666);

	return 0;
}

加油!


网站公告

今日签到

点亮在社区的每一天
去签到