2012-10-23 50 views
1

我在C中做了一個簡單的變量參數列表函數,但它不起作用。當我用一個參數調用該函數,然後在該函數內檢查該參數時,該參數將失去其價值。 例如在下面的代碼中,當我檢查「格式」的值時,它始終保持爲NULL .i.e。它始終顯示「格式爲NULL」。在調試消息中。 請指導我,這個原因有什麼可能性。進行變量參數列表功能

Calling the function: lcdPrintf("Change"); 

int lcdPrintf(char * format, ...) 
{ 
    if (*format) { 
     printf("format is not NULL.\r\n"); 
    } 
    else { 
     printf("format is NULL.\r\n"); 
    } 

    return -1; 
} 
+0

Works [here](http://codepad.org/IvvD62Zl)like魅力;這絕對是更多的。 – raina77ow

+0

你應該檢查格式,而不是格式。無論如何,我不知道它是如何告訴你「格式爲NULL」。除非你用lcdPrintf(「」)來調用它? – LSerni

+0

謝謝大家的回覆。代碼絕對正確。正如我正在研究瑞薩RX63N微控制器,我認爲,堆棧可能會被填滿。或者可變參數保存的內存可能會被填充。但我不確定,這個變量參數保存在哪裏。我該如何檢查內存是否充滿!請指導我如何跟蹤這個內存問題。用於stdarg.h的 – user977601

回答

1

您使用if (*format)時,使用if (format)如果你想檢查指針的有效性用於測試由格式指出的第一個字符的值。但隨着你寫的電話,它應該無論如何工作。

使用可變參數需要stdarg.h以及使用宏va_start,va_argva_end來使用它。

變量參數處理需要知道您使用的每個參數的類型。這就是格式字符串在printf中有用的地方。每個參數都有一些類型(%schar *,%d是一個整數),並且它幫助va_arg宏知道需要讀取多少個字節才能獲取下一個參數值。

下面是使用va_args

#include <stdarg.h> 

void printIntegers(int count, ...) 
{ 
    va_list ap; 
    int i; 

    va_start(ap, count); 
    for (i = 0; i < count; i++) { 
     int v = va_arg(ap, int); 

     printf("%d\n", v); 
    } 
    va_end(ap);      
} 

int main() 
{ 
    printIntegers(2, 12, 42); 
} 
+0

+1 – paulsm4

0

我用下面的代碼測試你的功能,它似乎工作的一個簡單的例子。問題是否可能源自代碼中的其他位置?

#include <stdio.h> 

int lcdPrintf(char * format, ...) 
{ 
    if (*format) { 
     printf("format is not NULL.\r\n"); 
    } 
    else { 
     printf("format is NULL.\r\n"); 
    } 
    return 1; 
} 

int main(){ 
    lcdPrintf("Test"); // Prints "format is not NULL." 
    return (0); 
} 
0

請指引我,什麼是這項事業的可能性。

您的代碼包含一個錯誤,它會讓您檢查格式字符串的第一個字符,在本例中爲'C'(對於「更改」)。

因此,有一種可能性:您傳遞的格式字符串具有零首字符,即它是空的。

#include <stdio.h> 

int lcdPrintf(char * format, ...) 
{ 
    /* if you want to check whether format is null, the test ought to be */ 
    /* if (format) ..., not if (*format) ... */ 

    if (*format) { 
     printf("format is not NULL.\r\n"); 
    } 
    else { 
     printf("format is NULL.\r\n"); 
    } 
    return 0; 
} 

int main(void) 
{ 
     lcdPrintf(""); 
     return 0; 
} 

這將返回「format is NULL」。我沒有其他辦法,if如果你指定的代碼是你指定的(如果你沒有,所有的投注都關閉:-))