簡體   English   中英

va_list有問題嗎?

[英]Is va_list bugged?

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

int sumfinder(int num, ...);

int main(void)
{

    int res,i,a,b,c;
    scanf( "%d %d %d",&a, &b, &c );
    res = sumfinder(a, b, c);// i also tried res=sumfinder(a,(int)b,(int)c); typecasting but to no avail
    printf( "results= %d", res );
    return 0;

}

int sumfinder( int maxsize, ... )
{
    va_list argp;
    int i;
    int sum = 0;
    va_start( argp, maxsize );
    for( i = 0 ; i < maxsize; i++ )
        sum += va_arg( argp, int );
    va_end(argp);
    return sum;
}

請輸入input 2 3 4,您將得到output = 7,正確,因為3 + 4 = 7(2代表輸入值的數量)現在請嘗試... 2 3.0 4.0而您得到了錯誤的輸出,我嘗試打字但沒有什么可以解決問題。 令人震驚的是,代碼行sum + = va_arg(argp,int)應該對輸入2 3.0 4.0進行從float到int的轉換,但是不,它不這樣做,它期望使用int進行填充,否則問題就開始了。 ..更多的提示是浮點數據類型不起作用,它返回零輸出,我使用的是Windows10和gcc(...和代碼塊IDE)

va_arg()錯誤了嗎?

您無需檢查函數scanf的返回值。 此返回值計算成功寫入的參數的數量。

如果輸入值2 3.0 4.0則scanf函數將返回2。將讀取第一個和第二個參數,但第三個參數未初始化。 發生這種情況是因為您嘗試讀取整數但傳遞了浮點數( 3.0是一個浮點數)。 讀int由指定符%d指示:

scanf( "%d %d %d",&a, &b, &c );

然后使用未初始化的變量,並將其傳遞給函數sumfinder,從而導致未定義的行為。

解決方案是始終檢查函數的返回值,並確保執行在有效路徑上進行。

您做出了錯誤的假設:

代碼行sum + = va_arg(argp,int)應該將輸入2 3.0 4.0從float轉換為int。

在您的函數中,您沒有任何浮點值。 在main中,無論您為scanf鍵入什么,您的參數都是int類型。 它們不會因為您輸入.0而變成浮動。 除非您在定義中更改類型,否則在scanf中更改格式不會有任何不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM