在下面的程序中,在函數printf
的調用中缺少一個參數,這會在運行時導致不正確的行爲,但編譯時不會發出警告。如何在使用printf時捕獲缺少的參數?
#include<stdio.h>
int main(void)
{
int a = 1;
printf("%d:this is for test:%s",a);
return 0;
}
如何在編譯時捕獲此錯誤?
在下面的程序中,在函數printf
的調用中缺少一個參數,這會在運行時導致不正確的行爲,但編譯時不會發出警告。如何在使用printf時捕獲缺少的參數?
#include<stdio.h>
int main(void)
{
int a = 1;
printf("%d:this is for test:%s",a);
return 0;
}
如何在編譯時捕獲此錯誤?
爲什麼您正在使用 「%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
你錯過了這個問題的關鍵:這是一個意外忘記爲佔位符提供參數的例子。問題是如何以真實代碼捕捉這種意外遺漏。 – Angew
如果你傳遞的參數比格式說明符少,它是未定義的。編譯器不需要在未定義的行爲上產生任何錯誤。 雖然大部分編譯器都會這樣做。例如,GCC爲您的代碼生成以下代碼: 「警告:格式爲」 「的參數太少,編譯時爲: 」gcc -Wall -Wextra -std = c99 file.c「 – Burhan
...加上此不會編譯,有一個'h'丟失 – user463035818
該錯誤是因爲在
的printf( 「%d:這是用於測試:%S」,A);
您需要傳遞兩個參數,一個傳遞給%d,另一個傳遞給%s。 因此,現在a會代替「%d」的位置,您不會傳遞任何要代替%s的任何內容。
不是我的失望,但OP知道這是一個錯誤。問題是如何在編譯時捕捉到這個編程錯誤。 –
與gcc -Wall
編譯這種情況警告如:warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
你爲什麼要跳過一個參數:
在編譯時? – Marievi
通過提供所有必要的參數避免缺少參數。另外'void main()'應該是C++中的int main()或C中的int main(void)'(這也意味着你應該決定使用哪種語言) – UnholySheep
使用顯示警告的編譯器。 – BLUEPIXY