共用方式為


編譯器警告 (層級 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 每個預留位置需要兩個引數、一個提供要寫入的位址,另一個則提供第一個大小。 如需必要引數的說明,請查看每個程式庫函式的檔。