Condividi tramite


Avviso del compilatore (livello 1) C4473

'function': argomenti non sufficienti passati per la stringa di formato
i segnaposto e i relativi parametri prevedono argomenti variadic, ma sono stati forniti numeri
L'indice dell'argomento variadic mancante è obbligatorio per la stringa di formato 'format_string'
questo argomento viene usato da un identificatore di conversione
questo argomento viene usato come larghezza del campo
questo argomento viene usato come precisione
questo argomento viene usato come dimensione del buffer

Il compilatore ha rilevato una mancata corrispondenza tra il numero di argomenti necessari per soddisfare i segnaposto in una stringa di formato e il numero di argomenti specificati. Per l'uso corretto delle famiglie printf e scanf di funzioni variadic è necessario specificare il numero di argomenti specificato dalla stringa di formato. Alcuni segnaposto richiedono argomenti aggiuntivi, per specificare la larghezza, la precisione o la dimensione del buffer, nonché un argomento per il contenuto. Una mancata corrispondenza indica in genere che nel codice è presente un bug.

Per informazioni sugli argomenti associati ai segnaposto della stringa di formato della famiglia printf, vedere Sintassi della specifica del formato: funzioni printf e wprintf. Per informazioni specifiche sulla funzione funzione, vedere la documentazione.

Questo avviso è una novità di Visual Studio 2015.

Esempio

Questi esempi mostrano due modi in cui l'avviso C4473 può causare una mancata corrispondenza di una stringa di formato con i relativi argomenti e illustra anche come risolvere i problemi.

// 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
}

Nel primo messaggio di errore, il compilatore rileva che manca un argomento, ma non può indicare se l'argomento mancante è la larghezza o il contenuto, quindi presuppone che l'argomento fornito sia il primo, per la larghezza e che l'argomento mancante sia il secondo, per l'identificatore di conversione del tipo. È necessario esaminare la stringa di formato per determinare l'argomento mancante effettivo.

// 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
}

In questo esempio, scanf_s richiede due argomenti per ogni segnaposto, uno per specificare l'indirizzo in cui scrivere e un secondo per specificare le dimensioni del primo. Per una spiegazione degli argomenti obbligatori, vedere la documentazione relativa a ogni funzione di libreria.