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;
}
相關文章
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- AArch64中va_list/va_start/va_arg/...的實現
- C語言 將函式(有參、無參)作為引數傳遞C語言函式
- python中函式的引數傳遞Python函式
- 函式的引數傳遞函式
- Python語法—函式及引數傳遞Python函式
- JavaScript函式傳遞引數JavaScript函式
- 函式作為引數傳遞函式
- 函式引數傳遞及返回函式
- C#語言函式遞迴C#函式遞迴
- Python的函式引數傳遞:傳值?引用?Python函式
- 如何計算PHP函式中傳遞的引數數量PHP函式
- php函式引用傳遞引數的方法PHP函式
- GO語言————6.3 傳遞變長引數Go
- C語言qsort函式的使用C語言函式
- 函式中引數傳值函式
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Python3之函式的引數傳遞與引數定義Python函式
- JavaScript為事件處理函式傳遞引數JavaScript事件函式
- C語言的函式C語言函式
- c++單例模式、常量成員函式、引數傳遞、友元C++單例模式函式
- C++引數的傳遞方式C++
- 對 “C語言指標變數作為函式引數” 的個人理解C語言指標變數函式
- 『無為則無心』Python函式 — 26、Python函式引數的傳遞方式Python函式
- go語言引數傳遞到底是傳值還是傳引用Go
- Golang 切片作為函式引數傳遞的陷阱與解答Golang函式
- C語言用二維陣列作為函式入口引數的小結C語言陣列函式
- c語言快速排序(庫函式使用)C語言排序函式
- GO語言————6.7 將函式作為引數Go函式
- GO語言————6.6 遞迴函式Go遞迴函式
- C語言——使用函式輸出指定範圍內的Fibonacci數C語言函式
- C語言常用函式C語言函式
- C語言 execve()函式C語言函式
- js中 函式引數的 傳值/傳引用 問題JS函式
- C語言函式sscanf()的用法C語言函式
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- GO語言————6.2 函式引數與返回值Go函式