C語言使用函式引數傳遞中的省略號:va_list, va_start, va_arg, va_end
首先要處理這種省略號的引數的話,需要包含標頭檔案#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;
}
相關文章
- va_list/va_start/va_arg/va_end深入分析
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- C 可變引數函式分析(va_start,va_end,va_list...)函式
- AArch64中va_list/va_start/va_arg/...的實現
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- C語言 將函式(有參、無參)作為引數傳遞C語言函式
- C語言結構體及函式傳遞陣列引數示例C語言結構體函式陣列
- 函式的引數傳遞函式
- python中函式的引數傳遞Python函式
- js中函式引數值傳遞和引用傳遞JS函式
- JavaScript函式傳遞引數JavaScript函式
- JavaScript函式引數傳遞JavaScript函式
- python 函式引數的傳遞(引數帶星號的說明)Python函式
- Python語法—函式及引數傳遞Python函式
- 使用arguments物件獲取函式傳遞的引數物件函式
- 函式作為引數傳遞函式
- 函式引數傳遞及返回函式
- 如何計算PHP函式中傳遞的引數數量PHP函式
- C#語言函式遞迴C#函式遞迴
- python中函式引數傳遞的幾種方法Python函式
- php函式引用傳遞引數的方法PHP函式
- C/C++中的引數傳遞方式C++
- python函式之引數傳遞Python函式
- Python的函式引數傳遞:傳值?引用?Python函式
- C語言kill()函式:傳送訊號給指定的程式C語言函式
- GO語言————6.3 傳遞變長引數Go
- 使用java模擬scala函數語言程式設計將函式作為引數傳入方法中Java函數程式設計函式
- C語言_結構體變數指標做函式引數的使用案例C語言結構體變數指標函式
- JavaScript 事件處理函式傳遞引數JavaScript事件函式
- onclick事件處理函式傳遞引數事件函式
- va_start和va_end使用詳解
- 函式中引數傳值函式
- GO中的函式設計時候,引數傳遞選擇傳遞值還是傳遞指標?Go函式指標
- C語言qsort函式的使用C語言函式
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- C語言alarm()函式:設定訊號傳送鬧鐘C語言函式
- JavaScript為事件處理函式傳遞引數JavaScript事件函式