2015-11-13 68 views
0

我正在學習cd中的stdarg.h,我試圖打印所有傳遞給函數的參數,但不知道有多少個參數,但是我還沒有想出解決方案,在這發生過程中,無論發生什麼我傳遞給strtest。 它總是打印0. 1. 2. 3.va_arg總是運行4次

void strtest(char *fmt, ...){ 
    va_list argp; 
    int i = 0; 

    va_start(argp, fmt); 

    while(va_arg(argp, char*)) 
     printf("%d\t", i++); 

    va_end(argp); 
} 

int main(int argc, char *argv[]){ 
    strtest("s"); 
    printf("\n"); 
    return 0; 
} 

回答

0

以下是顯示傳遞未知數量參數的一種方法的示例。

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

void print (char *first, ...) 
{ 
    va_list argptr; 
    char *next; 
    va_start (argptr, first); 
    next = first; 
    while (next) { 
     printf ("%s\n", next); 
     next = va_arg(argptr, char*); 
     } 
    va_end (argptr); 
} 

int main(void) 
{ 
    print("hello","world", NULL);  // NULL as sentinel 
    return 0; 
} 

程序輸出

hello 
world 

也許你能適應這種使用int參數您的需求。

5

有沒有標準的機制,將告訴你傳遞給一個可變參數函數的參數數量。像printf()這樣的函數可以工作,因爲它們可以通過檢查格式字符串來確定參數的數量。

+0

看到這個http://stackoverflow.com/questions/1688942/variable-arguments-in-c-how-to-get-values-with-a-generic-type的方式來做到這一點。我不確定這是否符合標準,但取決於環境使得OP能夠工作。 – JJF

+0

@JJF這個問題是關於參數類型,而不是參數的數量。那裏有一個特定的答案,告訴你如何獲得計數? – Barmar

+0

查看帶有va_start(ap,count)的部分; for(i = 0; i JJF

1

這是在ISO的STDARG.H的定義9899 WG14 n1256

<STDARG.H>聲明一個類型和定義了四個宏,用於通過其數量和參數列表前進 頭類型對於被調用函數 翻譯時不知道

您必須將參數的數目以及可能的類型傳遞給調用者。這不一定要通過直接傳遞參數的數量來完成,還有其他方法,例如printf中使用的方法。

+1

或者包含'NULL'哨兵。 –

+0

或者解析一些類似於格式字符串的函數(不需要是格式字符串) –

+0

@WeatherVane只有所有參數都是相同類型的指針時,「NULL」標記纔有效。 – Barmar

0

你可以通過一個定點的功能,這樣

strtest("s", (char*)0); 

使得函數可以看到,它在參數列表的末尾。

0

如果你看一下stdarg頭文件的手冊頁,在va_arg包括本文

如果沒有一個參數,或者如果類型不是與 類型的實際下一個參數兼容(根據推廣到 默認參數促銷),會發生隨機錯誤。

除非你用NULL作爲最後一個參數調用strtest,否則va_arg會一直持續閱讀,直到它達到使其停止的東西。想想你現在正在做什麼等同於讀取超出範圍的數組。

我很驚訝它運行了4次,不管是什麼。我會希望計數等於你傳給strtest的參數的數量加2或更多。