vscanf_s, vwscanf_s

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

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

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.

Devuelve el número de campos que se han convertido y asignado correctamente; el valor devuelto no incluye los campos que se leyeron pero no se asignaron. 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 puntero NULL, 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 obtener más información sobre estos y otros códigos de error, vea errno, _doserrno, _sys_errlist y _sys_nerr.

La función vscanf_s lee datos de la secuencia de entrada estándar stdin y escribe los datos en ubicaciones que se proporcionan por 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 una secuencia de UNICODE.

A diferencia de vscanf y vwscanf, vscanf_s y vwscanf_s requieren que se especifique el tamaño de búfer para todos los parámetros de entrada del tipo c, C, s, S, o los conjuntos de control de cadenas que se incluyen en []. El tamaño de búfer en caracteres se pasa como parámetro adicional inmediatamente después del puntero en el búfer o la variable. El tamaño de búfer en caracteres de una cadena wchar_t no es igual 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 ajustará al búfer. Si no se usa ningún campo de especificación de ancho y la lectura de token es demasiado grande como para ajustarse al búfer, no se escribirá ningún valor en dicho búfer.

System_CAPS_ICON_note.jpg Nota

El parámetro de tamaño es del tipo unsigned, no size_t.

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

Asignaciones de rutina de texto genérico

Rutina TCHAR.H_UNICODE y _MBCS no definidos_MBCS definido_UNICODE definido
_vtscanf_svscanf_svscanf_svwscanf_s

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

RutinaEncabezado necesario
vscanf_s<stdio.h>
wscanf_s<stdio.h> o <wchar.h>

La consola no se admite en las aplicaciones de Tienda Windows 8.x. Se deben redirigir los identificadores estándar de flujo que están asociados a la consola, stdin, stdout y stderr, antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones de Tienda Windows 8.x. Para obtener información adicional de compatibilidad, vea Compatibilidad.

// 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 en el ejemplo, produce este resultado:

71 98.6 h z Byte characters

36 92.3 y n Wide characters

El número de entrada de campos es 6
El contenido es: Caracteres de byte 71 98.599998 h z
El número de entrada de campos es 6
El contenido es: Caracteres anchos 36 92.300003 y n

Compatibilidad con el 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

Mostrar: