C語言使用函式引數傳遞中的省略號:va_list, va_start, va_arg, va_end

Koma_Wong發表於2018-08-26

首先要處理這種省略號的引數的話,需要包含標頭檔案#include <stdarg.h>,然後利用下面的函式對“...”省略號變數進行處理。

va_list arg;
type va_arg( va_list arg, type );
void va_end( va_list arg );
void va_start( va_list arg, prev_param ); 

下面實現一個自己的print(),它的引數的傳遞是根據具體輸入的個數決定的。如下:

void print(char *msg, ...)
{
	char *p = msg;
	
	va_list arg;
	
	va_start(arg, msg);
	
	int _i;
	char _c;
	char * _s;
	
	while(*p != '\0')
	{
		switch(*p)
		{
			case '%':
				p++;
				switch(*p)
				{
					case 'd':
						_i = va_arg(arg, int);
						printf("%d", _i);
						break;
					case 'c':
						_c = va_arg(arg, int);
						printf("%c", _c);
						break;
					case 's':
						_s = va_arg(arg, char*);
						printf("%s", _s);
						break;
					default:
						break;
				}
				break;
			default:
				printf("%c", *p);
				break;
		}
		p++;
	}
	
	va_end(arg);
}

使用過程:

print("Hello %d, %s\n", 12, "World\n");

給出我的輸出:

$ gcc main.c
$ ./a
Hello 12, World

當然這只是最簡單的實現,實際的處理過程要比這複雜得多。僅供學習參考!!

給出完整的程式碼:

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

void print(char *msg, ...)
{
	char *p = msg;
	
	va_list arg;
	
	va_start(arg, msg);
	
	int _i;
	char _c;
	char * _s;
	
	while(*p != '\0')
	{
		switch(*p)
		{
			case '%':
				p++;
				switch(*p)
				{
					case 'd':
						_i = va_arg(arg, int);
						printf("%d", _i);
						break;
					case 'c':
						_c = va_arg(arg, int);
						printf("%c", _c);
						break;
					case 's':
						_s = va_arg(arg, char*);
						printf("%s", _s);
						break;
					default:
						break;
				}
				break;
			default:
				printf("%c", *p);
				break;
		}
		p++;
	}
	
	va_end(arg);
}

int main(int argc, char **argv)
{
	print("Hello %d, %s\n", 12, "World\n");
	
	return 0;
}

 

相關文章