vscanf_s
, vwscanf_s
Lee datos con formato del flujo de entrada estándar. Estas versiones de , vwscanf
tienen 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 cálculos matemáticos y 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