C言語変数パラメーター

C言語変数パラメーター

  C言語では、可変個引数関数と呼ばれる、可変数のパラメーターを持つ関数を定義できます。このような関数には、固定数の必須引数と、それに続く可変数のオプション引数が必要です。

1.変形可能なパラメータ相関関数

#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

  va_startは、 va_argおよびva_endが後で使用できるように、apポインターの初期化を完了します。この関数を最初に呼び出す必要があります。パラメータlastは、変数パラメータリストの前の最後のパラメータの名前です
  。va_argは、次のパラメータのタイプと値の取得を実現します。パラメータapは、va_startによって初期化されたパラメータリストです。va_arg()を呼び出すたびに、次の引数を取得するためにapが変更されます。パラメータタイプタイプは、指定されたデータタイプです。
  va_endはapNULLにポイントします。
  va_copyはパラメータリストsrcをdestにコピーします。この関数はc99でのみ定義されています。

2.変形可能なパラメーターはprintf関数を模倣します

#include <stdio.h>
#include <stdarg.h>
void my_printf(const char *fmt,...);
int main()
{
    
    
	my_printf("%s\n","123456");
	my_printf("%d %%\n",55);
	my_printf("%f\n",789.56);
	my_printf("%c\n",'c');
	my_printf("%ld,%lf\n",1234567890123,45.789625);
}
void my_printf(const char *fmt,...)
{
    
    
	va_list ap;
	va_start(ap,fmt);//ap=fmt
	char c,*s;
	int d;
	float f;
	long l;
	double b;
	while(*fmt)
	{
    
    
		if(*fmt!='%')
		{
    
    
			putchar(*fmt);//输出%前所有字符
		}
		else 
		{
    
    
			fmt++;//跳过%
			switch(*fmt)
			{
    
    
				case 'c'://字符
					c=(char )va_arg(ap,int);//字符存储时按int空间处理
					fprintf(stdout,"%c",c);
					break;
				case 'd'://整数
					d=va_arg(ap,int);
					fprintf(stdout,"%d",d);
					break;
				case 'f'://浮点数
					f=(float)va_arg(ap,double);//浮点数据处理时按double处理
					fprintf(stdout,"%f",f);
					break;
				case '%'://%%
					putchar(*fmt);
					break;
				case 's'://字符串
					s=va_arg(ap,char *);
					fprintf(stdout,"%s",s);
					break;
				case 'l':
					fmt++;
					if(*fmt=='d')//长整形%ld
					{
    
    
						l=va_arg(ap,long);
						fprintf(stdout,"%ld",l);
					}
					else if(*fmt=='f')//双精度浮点型%lf
					{
    
    
						b=va_arg(ap,double);
						fprintf(stdout,"%lf",b);
					}
					break;
			}
		}
		fmt++;
	}
	va_end(ap);//ap=NULL
}

  実行結果:

[wbyq@wbyq 0414work]$ gcc main.c 
[wbyq@wbyq 0414work]$ ./a.out 
123456
55 %
789.559998
c
1234567890123,45.789625

おすすめ

転載: blog.csdn.net/weixin_44453694/article/details/124271934