編譯器警告 (層級 1) C4473
'function':傳遞給格式字串的引數不足
占位元及其參數預期 number variadic 自變數,但已提供 number
格式字串 『format_string』 需要遺漏的 variadic 自變數索引
轉換規範會使用此自變數
這個自變數會當做欄位寬度使用
這個自變數用來做為有效位數
這個自變數用來作為緩衝區大小
編譯程式偵測到滿足格式字串中佔位元元所需的自變數數目與提供的自變數數目不符。 正確使用 variadic 函式的 printf 和 scanf 系列,需要您提供格式字串所指定的自變數數目。 某些佔位元需要額外的自變數,以指定寬度、有效位數或緩衝區大小,以及內容的自變數。 不相符通常表示您的程式代碼中有錯誤。
如需與 printf 系列格式字串佔位元元相關聯的自變數資訊,請參閱 格式規格語法:printf 和 wprintf 函式。 如需函式的特定資訊,請參閱檔。
此警告是Visual Studio 2015的新功能。
範例
這些範例顯示兩種方式警告 C4473 可能會因為格式字串與其自變數不符而產生,同時也示範如何修正問題。
// c4473p.cpp
// compile with: cl /c /W4 c4473p.cpp
#include <stdio.h>
void print_func(int a, float f)
{
printf_s("This takes %*f arguments.\n", f); // C4473, missing * width argument
printf_s("This takes %*f arguments.\n", a, f); // fix: supply width argument
}
在第一個錯誤訊息中,編譯程式會偵測到自變數遺失,但無法判斷遺漏的自變數是否為寬度或內容,因此它會假設提供的自變數是第一個、寬度,而遺漏的自變數則是類型轉換規範的第二個自變數。 您必須檢查格式字串,以判斷實際的遺漏自變數。
// c4473s.cpp
// compile with: cl /c /W4 c4473s.cpp
#include <stdio.h>
void scan_func(int a, float f)
{
char name[20];
scanf_s("%s", &name); // C4473, missing buffer size argument
scanf_s("%s", &name, sizeof(name)); // fix: supply buffer size argument
}
在此範例中, scanf_s 每個佔位元需要兩個自變數、一個提供要寫入的位址,另一個則提供第一個大小。 如需必要自變數的說明,請查看每個連結庫函式的檔。