16.4 怎樣寫一個有可變參數的函數?

用 <stdarg.h> 提供的輔助設施。

下面是一個把任意個字符串連接起來的函數, 結果存在 malloc 的內存中:

    #include <stdlib.h>          /* 說明 malloc, NULL, size_t */
    #include <stdarg.h>          /* 說明 va_ 相關類型和函數 */
    #include <string.h>          /* 說明 strcat 等 */

    char *vstrcat(const char *first, ...)
    {
        size_t len;
        char *retbuf;
        va_list argp;
        char *p;

        if(first == NULL)
	    return NULL;

        len = strlen(first);

        va_start(argp, first);

        while((p = va_arg(argp, char *)) != NULL)
	    len += strlen(p);

        va_end(argp);

        retbuf = malloc(len + 1);   /* +1 包含終止符 \0 */

        if(retbuf == NULL)
	    return NULL;	    /* 出錯 */

        (void)strcpy(retbuf, first);

        va_start(argp, first);	    /* 重新開始掃瞄 */

        while((p = va_arg(argp, char *)) != NULL)
	    (void)strcat(retbuf, p);

        va_end(argp);

        return retbuf;
    }
調用如下:
	char *str = vstrcat("Hello, ", "world!", (char *)NULL);
注意最後一個參數的類型重置; 參見問題 5.2, 15.3。 注意調用者要釋放返回的存儲空間, 那是用 malloc 分配的。

參考資料: [K&R2, Sec. 7.3 p. 155, Sec. B7 p. 254]; [ISO, Sec. 7.8]; [Rationale, Sec. 4.8]; [H&S, Sec. 11.4 pp. 296-9]; [CT&P, Sec. A.3 pp. 139-141]; [PCS, Sec. 11 pp. 184-5, Sec. 13 p. 242]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)