Compartir a través de


Advertencia del compilador (nivel 1) C4473

"function": no se pasaron suficientes argumentos para la cadena de formato
los marcadores de posición y sus parámetros esperan número argumentos variádicos, pero se proporcionaron número
la cadena de formato "format_string" requiere el índice de argumentos variádicos que falta
este argumento lo usa un especificador de conversión
este argumento se utiliza como un ancho de campo
este argumento se utiliza como una precisión
este argumento se utiliza como un tamaño de búfer

El compilador detectó una falta de concordancia entre el número de argumentos necesarios para satisfacer el marcador de posición en una cadena de formato y el número de argumentos que se proporcionó. El uso correcto de las familias printf y scanf de funciones variádicas requiere que se proporcionen los argumentos que especifique la cadena de formato. Algunos marcadores de posición requieren argumentos adicionales para especificar el ancho, la precisión o el tamaño del búfer, así como un argumento para el contenido. Por lo general, cualquier falta de concordancia significa que hay un error en el código.

Para información sobre los argumentos asociados a los marcadores de posición de cadena de formato de la familia printf, consulte Sintaxis de especificación de formato: funciones printf y wprintf. Consulte la documentación para obtener información específica de la función function.

Esta advertencia es nueva en Visual Studio 2015.

Ejemplo

En estos ejemplos se muestran dos formas en que la advertencia C4473 puede ser la consecuencia de un error de coincidencia de cadena de formato con sus argumentos y también se muestra cómo corregir los problemas.

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

En el primer mensaje de error, el compilador detecta que falta un argumento, pero no puede indicar si el argumento que falta es el ancho o el contenido, por lo que supone que el argumento proporcionado es el primero, para el ancho y el argumento que falta es el segundo, para el especificador de conversión de tipos. Debe examinar la cadena de formato para determinar el argumento real que falta.

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

En este ejemplo, scanf_s requiere dos argumentos para cada marcador de posición, uno para proporcionar la dirección en la que escribir y un segundo para proporcionar el tamaño del primero. Consulte la documentación de cada función de la biblioteca para ver una explicación de los argumentos necesarios.