Partage via


Avertissement du compilateur (niveau 1) C4473

'function' : arguments insuffisants passés pour la chaîne de format
espaces réservés et leurs paramètres attendent des arguments variadiques de nombre , mais le nombre a été fourni
l’index d’argument variadicique manquant est requis par la chaîne de format 'format_string'
cet argument est utilisé par un spécificateur de conversion
cet argument est utilisé comme largeur de champ
cet argument est utilisé comme précision
cet argument est utilisé comme taille de mémoire tampon

Le compilateur a détecté une incompatibilité entre le nombre d’arguments requis pour satisfaire les espaces réservés dans une chaîne de format et le nombre d’arguments fournis. L’utilisation correcte des familles printf et scanf de fonctions variadiciques nécessite que vous fournissez autant d’arguments que spécifiés par la chaîne de format. Certains espaces réservés nécessitent des arguments supplémentaires, pour spécifier la largeur, la précision ou la taille de la mémoire tampon, ainsi qu’un argument pour le contenu. Une incompatibilité signifie généralement qu’il existe un bogue dans votre code.

Pour plus d’informations sur les arguments associés aux espaces réservés de chaînes de format de famille printf, consultez la syntaxe de spécification de format : fonctions printf et wprintf. Consultez la documentation pour plus d’informations spécifiques à la fonction de fonction.

Cet avertissement est nouveau dans Visual Studio 2015.

Exemple

Ces exemples montrent deux façons d’avertir L’avertissement C4473 peut résulter d’une incompatibilité de chaîne de format avec ses arguments, et montre également comment résoudre les problèmes.

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

Dans le premier message d’erreur, le compilateur détecte qu’un argument est manquant, mais ne peut pas indiquer si l’argument manquant est la largeur ou le contenu, de sorte qu’il suppose que l’argument fourni est le premier, pour la largeur, et que l’argument manquant est le deuxième, pour le spécificateur de conversion de type. Vous devez examiner la chaîne de format pour déterminer l’argument manquant réel.

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

Dans cet exemple, scanf_s nécessite deux arguments pour chaque espace réservé, un pour fournir l’adresse à écrire et une seconde pour fournir la taille du premier. Consultez la documentation de chaque fonction de bibliothèque pour obtenir une explication des arguments requis.