2017-05-03 12 views
-3

在下面的程序中,在函數printf的調用中缺少一個參數,這會在運行時導致不正確的行爲,但編譯時不會發出警告。如何在使用printf時捕獲缺少的參數?

#include<stdio.h> 

int main(void) 
{ 
    int a = 1; 

    printf("%d:this is for test:%s",a); 
    return 0; 
} 

如何在編譯時捕獲此錯誤?

+6

你爲什麼要跳過一個參數:

warning: too few arguments for format 

在編譯時? – Marievi

+3

通過提供所有必要的參數避免缺少參數。另外'void main()'應該是C++中的int main()或C中的int main(void)'(這也意味着你應該決定使用哪種語言) – UnholySheep

+1

使用顯示警告的編譯器。 – BLUEPIXY

回答

-5

爲什麼您正在使用 「%s」 嗎?這裏不需要使用「%s」來打印字符串值。 對於整數值,您只需要「%d」。

像這樣運行你的代碼。

#include<stdio.> 
int main() 
{ 
    int a = 1; 
    printf("%d: this is for test", a); 
} 

謝謝。

[編輯]

如果你通過更少的參數比格式說明這是不確定的。編譯器不需要在未定義的行爲上產生任何錯誤。

雖然,大多數編譯器會這樣做。 GCC,例如產生了如下的代碼:

gcc -Wall -Wextra -std=c99 file.c 
+0

你錯過了這個問題的關鍵:這是一個意外忘記爲佔位符提供參數的例子。問題是如何以真實代碼捕捉這種意外遺漏。 – Angew

+0

如果你傳遞的參數比格式說明符少,它是未定義的。編譯器不需要在未定義的行爲上產生任何錯誤。 雖然大部分編譯器都會這樣做。例如,GCC爲您的代碼生成以下代碼: 「警告:格式爲」 「的參數太少,編譯時爲: 」gcc -Wall -Wextra -std = c99 file.c「 – Burhan

+1

...加上此不會編譯,有一個'h'丟失 – user463035818

-6

該錯誤是因爲在

的printf( 「%d:這是用於測試:%S」,A);

您需要傳遞兩個參數,一個傳遞給%d,另一個傳遞給%s。 因此,現在a會代替「%d」的位置,您不會傳遞任何要代替%s的任何內容。

+2

不是我的失望,但OP知道這是一個錯誤。問題是如何在編譯時捕捉到這個編程錯誤。 –

2

gcc -Wall
編譯這種情況警告如:warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]