C语言 NOTE18

==========================================================

变参函数:

  • 头文件
    #include <stdarg.h>
  • 涉及函数:
void va_start(va_list ap, last); //将指针ap指向last
type va_arg(va_list ap, type); //返回当前ap指针指向的值,然后指向下一个可变参数
void va_end(va_list ap); //将指针赋值为NULL
void va_copy(va_list dest, va_list src) //拷贝指针ap

demo:

File Name: 1.变参函数.c
Author: xiening
Mail: [email protected]
Created Time: 2019年11月26日 星期二 11时32分06秒

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

void func(char *format, ...)
{
	va_list ap;
	va_start(ap, format);
	while(*format)
	{
		char *tem = strchr(format, '%');
		char *tem1 = malloc(10);
		char tem2;
		if(NULL == tem)
			goto dest;
		if(tem == format)
		{
			switch(*(tem+1))
			{
				case 's':
					printf("%s", va_arg(ap, char*));break;
				case 'd':
					printf("%d", va_arg(ap, int));break;
				case 'c':
					printf("%c", (char)va_arg(ap, int));break;

			}
			format = tem +2;
		} 
		else if(1 == (tem-format))
		{			
				memcpy(&tem2, format, 1);
				switch(*(tem+1))
				{
					case 's':
						printf("%c%s", tem2, va_arg(ap, char*));break;
					case 'd':
						printf("%c%d", tem2, va_arg(ap, int));break;
					case 'c':
						printf("%c%c", tem2, (char)va_arg(ap, int));break;
				}
				format = tem + 2;

		}
		else 
		{
			strncpy(tem1, format, (tem-format));
			switch(*(tem+1))
			{
				case 's':
					printf("%s%s", tem1, va_arg(ap, char*));break;
				case 'd':
					printf("%s%d", tem1, va_arg(ap, int));break;
				case 'c':
					printf("%s%c", tem1, (char)va_arg(ap, int));break;
				default:
					tem1 = "";

			}
			format = tem + 2;
		}
		
	}
dest:	
	if(NULL != format)
		printf("%s", format);
	va_end(ap);
}

int main(int argc, char const *argv[])
{
	func("SimpleInfo:%s-%d\n", "xiening", 12356);
    return 0 ;
}	
发布了52 篇原创文章 · 获赞 2 · 访问量 2016

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/103254059