- 註冊時間
- 2006-10-8
- 最後登錄
- 2019-6-20
- 主題
- 查看
- 積分
- 1306
- 閱讀權限
- 110
- 文章
- 1393
- 相冊
- 0
- 日誌
- 1
![Rank: 11](static/image/common/star_level3.gif) ![Rank: 11](static/image/common/star_level3.gif) ![Rank: 11](static/image/common/star_level2.gif) ![Rank: 11](static/image/common/star_level1.gif)
狀態︰
離線
|
在說明函數的章節裡,所有範例函數的參數個數都是固定的,但讀者有沒有發覺使用printf,scanf函數時,我們所給予的參數個數卻是不定長的!本節說明如何定義具有不定長參數的函數。
printf的宣告如下:
int printf(char *fmt, ...)
處理不定長參數需要用到<stdarg.h>裡面的函數。va_list型態可用來存取每一個參數:
#include <stdarg.h>
// or #include <sys/varargs.h>
void minprintf(char *fmt, ...) {
va_list ap; /* pointer to each unnamed arg in turn */
char *p, *sval;
int ival;
double dval;
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
for (p = fmt; *p; p++) { // check each character
if (*p != '%') { // 不是特殊字元,直接輸出即可
putchar(*p);
continue;
}
switch(*++p) { // 檢查%的下一個字元是甚麼
case 'd':
ival = va_arg(ap, int);
printf("%d", ival);
break;
case 'f':
dval = va_arg(ap, double);
printf("%f", dval);
break;
case 's':
for (sval = va_arg(ap, char *); *sval; sval++) { // 印出sval所指到的所有字元
putchar(*sval);
}
break;
default :
putchar(*p);
break;
}
}
va_end(ap); // clean up when done */
}
|
|