Compartir a través de


vscanf_s, vwscanf_s

Lee datos con formato del flujo de entrada estándar. Estas versiones de , vwscanftienen mejoras devscanf seguridad, como se describe en Características de seguridad de CRT.

Sintaxis

int vscanf_s(
   const char *format,
   va_list arglist
);
int vwscanf_s(
   const wchar_t *format,
   va_list arglist
);

Parámetros

format
Cadena de control de formato.

arglist
Lista de argumentos de variable.

Valor devuelto

Devuelve el número de campos convertidos y asignados correctamente; El valor devuelto no incluye campos leídos pero no asignados. Un valor devuelto de 0 indica que no se ha asignado ningún campo. El valor devuelto es EOF para un error, o si se encuentra el carácter de final de archivo o el carácter de final de cadena en el primer intento de leer un carácter. Si format es un NULL puntero, se invoca el controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, vscanf_s y vwscanf_s devuelven EOF y establecen errno en EINVAL.

Para información sobre estos y otros códigos de error, consulte errno, _doserrno_sys_errlist y _sys_nerr.

Comentarios

La función vscanf_s lee datos del flujo de entrada estándar stdin y los escribe en las ubicaciones que proporciona la lista de argumentos arglist. Cada argumento de la lista debe ser un puntero a una variable de un tipo que se corresponda con un especificador de tipo en format. Si la copia tiene lugar entre cadenas que se superponen, el comportamiento es indefinido.

vwscanf_s es una versión con caracteres anchos de vscanf_s; el argumento format para vwscanf_s es una cadena de caracteres anchos. vwscanf_s y vscanf_s se comportan exactamente igual si el flujo se abre en modo ANSI. vscanf_s no admite la entrada desde un flujo UNICODE.

A diferencia vscanf de y vwscanf, vscanf_s y vwscanf_s requieren que se especifique el tamaño del búfer para todos los parámetros de entrada de tipo c, C, s, S o conjuntos de controles de cadena incluidos en [].. El tamaño del búfer en caracteres se pasa como otro parámetro inmediatamente después del puntero al búfer o variable. El tamaño del búfer en caracteres de una wchar_t cadena no es el mismo que el tamaño en bytes.

El tamaño de búfer incluye el valor nulo final. Puede usar un campo de especificación de ancho para garantizar que el token que se lee se ajuste al búfer. Si no se usa ningún campo de especificación de ancho y el token leído en es demasiado grande para caber en el búfer, no se escribe nada en ese búfer.

Nota:

El size parámetro es de tipo unsigned, no size_t.

Para más información, vea scanf (Especificación de ancho).

Asignaciones de rutinas de texto genérico

Rutina TCHAR.H _UNICODE y _MBCS no definidos _MBCS definido _UNICODE definido
_vtscanf_s vscanf_s vscanf_s vwscanf_s

Para obtener más información, vea Formato de campos de especificación: scanf y wscanf funciones.

Requisitos

Routine Encabezado necesario
vscanf_s <stdio.h>
wscanf_s <stdio.h> o <wchar.h>

La consola no se admite en las aplicaciones de la Plataforma universal de Windows (UWP). Los identificadores de flujo estándar asociados a la consola, stdin, stdout y stderr, se deben redirigir antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones para UWP. Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

// crt_vscanf_s.c
// compile with: /W3
// This program uses the vscanf_s and vwscanf_s functions
// to read formatted input.

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int call_vscanf_s(char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int call_vwscanf_s(wchar_t *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vwscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int main( void )
{
    int   i, result;
    float fp;
    char  c, s[81];
    wchar_t wc, ws[81];
    result = call_vscanf_s("%d %f %c %C %s %S", &i, &fp, &c, 1,
                           &wc, 1, s, _countof(s), ws, _countof(ws) );
    printf( "The number of fields input is %d\n", result );
    printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);
    result = call_vwscanf_s(L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                            &wc, 1, s, _countof(s), ws, _countof(ws) );
    wprintf( L"The number of fields input is %d\n", result );
    wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws);
}

Cuando a este programa se le proporciona la entrada del ejemplo, produce el siguiente resultado:

71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters

Consulte también

Compatibilidad con matemáticas y punto flotante
E/S de secuencia
Configuración regional
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
vscanf, vwscanf