vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
|
Definido en el encabezado
<stdio.h>
|
||
|
int
vscanf
(
const
char
*
restrict
format, va_list vlist
)
;
|
(1) | (desde C99) |
|
int
vfscanf
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(2) | (desde C99) |
|
int
vsscanf
(
const
char
*
restrict
buffer,
const
char
*
restrict
format,
va_list vlist ) ; |
(3) | (desde C99) |
|
int
vscanf_s
(
const
char
*
restrict
format, va_list vlist
)
;
|
(4) | (desde C11) |
|
int
vfscanf_s
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(5) | (desde C11) |
|
int
vsscanf_s
(
const
char
*
restrict
buffer,
const
char
*
restrict
format,
va_list vlist ) ; |
(6) | (desde C11) |
Lee datos de una variedad de fuentes, los interpreta según
format
y almacena los resultados en ubicaciones definidas por
vlist
.
stream
buffer
. Alcanzar el final de la cadena es equivalente a alcanzar la condición de fin de archivo para
fscanf
-
- cualquiera de los argumentos de tipo puntero es un puntero nulo
-
format,stream, obufferes un puntero nulo - el número de caracteres que serían escritos por %c, %s, o %[, más el carácter nulo terminador, excedería el segundo argumento (rsize_t) proporcionado para cada uno de esos especificadores de conversión
- opcionalmente, cualquier otro error detectable, como un especificador de conversión desconocido
-
Como con todas las funciones con verificación de límites,
vscanf_s,vfscanf_s, yvsscanf_ssolo están garantizadas de estar disponibles si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdio.h> .
Contenidos |
Parámetros
| stream | - | flujo de archivo de entrada desde el cual leer |
| buffer | - | puntero a una cadena de caracteres terminada en nulo desde la cual leer |
| format | - | puntero a una cadena de caracteres terminada en nulo que especifica cómo leer la entrada |
| vlist | - | lista de argumentos variables que contiene los argumentos receptores. |
La cadena de
formato
consiste en
- caracteres multibyte que no son espacios en blanco, excepto % : cada uno de estos caracteres en la cadena de formato consume exactamente un carácter idéntico del flujo de entrada, o provoca que la función falle si el siguiente carácter en el flujo no es igual.
- caracteres de espacio en blanco: cualquier carácter individual de espacio en blanco en la cadena de formato consume todos los caracteres consecutivos de espacio en blanco disponibles en la entrada (determinado como si se llamara a isspace en un bucle). Nótese que no hay diferencia entre " \n " , " " , " \t \t " , u otros espacios en blanco en la cadena de formato.
- especificaciones de conversión. Cada especificación de conversión tiene el siguiente formato:
-
- carácter % introductorio.
-
- (opcional) carácter de supresión de asignación * . Si esta opción está presente, la función no asigna el resultado de la conversión a ningún argumento receptor.
-
- (opcional) número entero (mayor que cero) que especifica el ancho máximo de campo , es decir, el número máximo de caracteres que la función puede consumir al realizar la conversión especificada por la especificación de conversión actual. Nótese que % s y % [ pueden provocar desbordamiento de búfer si no se proporciona el ancho.
-
- (opcional) modificador de longitud que especifica el tamaño del argumento receptor, es decir, el tipo de destino real. Esto afecta la precisión de conversión y las reglas de desbordamiento. El tipo de destino predeterminado es diferente para cada tipo de conversión (ver tabla abajo).
-
- especificador de formato de conversión.
Los siguientes especificadores de formato están disponibles:
|
Especificador
de conversión |
Explicación |
Tipo de
argumento esperado |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificador de Longitud→ |
hh
|
h
|
ninguno |
l
|
ll
|
j
|
z
|
t
|
L
|
|
| Solo disponible desde C99→ | Sí | Sí | Sí | Sí | Sí | |||||
%
|
Coincide con el literal
%
.
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Coincide con un carácter o una secuencia de caracteres .
|
N/A | N/A |
char
*
|
wchar_t
*
|
N/A | N/A | N/A | N/A | N/A |
s
|
Coincide con una secuencia de caracteres que no son espacios en blanco (una cadena ).
|
|||||||||
[
set
]
|
Coincide con una secuencia no vacía de caracteres del set de caracteres.
|
|||||||||
d
|
Coincide con un entero decimal .
|
signed
char
*
o
unsigned
char
*
|
signed
short
*
o
unsigned
short
*
|
signed
int
*
o
unsigned
int
*
|
signed
long
*
o
unsigned
long
*
|
signed
long
long
*
o
unsigned
long
long
*
|
size_t
*
|
N/A | ||
i
|
Coincide con un entero .
|
|||||||||
u
|
Coincide con un entero decimal sin signo .
|
|||||||||
o
|
Coincide con un entero octal sin signo .
|
|||||||||
x
X
|
Coincide con un entero hexadecimal sin signo .
|
|||||||||
n
|
Devuelve el número de caracteres leídos hasta el momento .
|
|||||||||
a
(C99)
A
(C99)
e
E
f
F
(C99)
g
G
|
Coincide con un número de punto flotante .
|
N/A | N/A |
float
*
|
double
*
|
N/A | N/A | N/A | N/A |
long
double
*
|
p
|
Coincide con la secuencia de caracteres definida por la implementación que define un puntero .
|
N/A | N/A |
void
**
|
N/A | N/A | N/A | N/A | N/A | N/A |
| Notas | ||||||||||
|
Para cada especificador de conversión distinto de n , la secuencia más larga de caracteres de entrada que no exceda el ancho de campo especificado y que sea exactamente lo que el especificador de conversión espera o sea un prefijo de una secuencia que esperaría, es lo que se consume del flujo. El primer carácter, si existe, después de esta secuencia consumida permanece sin leer. Si la secuencia consumida tiene longitud cero o si la secuencia consumida no puede convertirse como se especificó anteriormente, ocurre un fallo de coincidencia a menos que el fin de archivo, un error de codificación o un error de lectura impidieran la entrada del flujo, en cuyo caso es un fallo de entrada. Todos los especificadores de conversión distintos de [ , c , y n consumen y descartan todos los caracteres de espacio en blanco iniciales (determinados como si se llamara a isspace ) antes de intentar analizar la entrada. Estos caracteres consumidos no cuentan para el ancho de campo máximo especificado. Los especificadores de conversión lc , ls , y l [ realizan la conversión de multibyte a carácter ancho como si se llamara a mbrtowc con un objeto mbstate_t inicializado a cero antes de convertir el primer carácter. Los especificadores de conversión s y [ siempre almacenan el terminador nulo además de los caracteres coincidentes. El tamaño del array de destino debe ser al menos uno mayor que el ancho de campo especificado. El uso de % s o % [ , sin especificar el tamaño del array de destino, es tan inseguro como gets .
Las especificaciones de conversión correctas para los
tipos de enteros de ancho fijo
(
int8_t
, etc.) se definen en el encabezado
Hay un punto de secuencia después de la acción de cada especificador de conversión; esto permite almacenar múltiples campos en la misma variable "receptora". Al analizar un valor de coma flotante incompleto que termina en el exponente sin dígitos, como analizar "100er" con el especificador de conversión % f , la secuencia "100e" (el prefijo más largo de un posible número de coma flotante válido) se consume, resultando en un error de coincidencia (la secuencia consumida no puede convertirse a un número de coma flotante), con "r" restante. Algunas implementaciones existentes no siguen esta regla y retroceden para consumir solo "100" , dejando "er" , por ejemplo, glibc bug 1765 . Si una especificación de conversión es inválida, el comportamiento es indefinido. |
||||||||||
Valor de retorno
Notas
Todas estas funciones invocan
va_arg
al menos una vez, el valor de
arg
es indeterminado después del retorno. Estas funciones no invocan
va_end
, y debe ser realizado por el llamador.
Ejemplo
#include <stdio.h> #include <stdbool.h> #include <stdarg.h> bool checked_sscanf(int count, const char* buf, const char *fmt, ...) { va_list ap; va_start(ap, fmt); int rc = vsscanf(buf, fmt, ap); va_end(ap); return rc == count; } int main(void) { int n, m; printf("Parsing '1 2'..."); if(checked_sscanf(2, "1 2", "%d %d", &n, &m)) puts("success"); else puts("failure"); printf("Parsing '1 a'..."); if(checked_sscanf(2, "1 a", "%d %d", &n, &m)) puts("success"); else puts("failure"); }
Salida:
Parsing '1 2'...success Parsing '1 a'...failure
Referencias
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.21.6.9 La función vfscanf (p: 327)
-
- 7.21.6.11 La función vscanf (p: 328)
-
- 7.21.6.14 La función vsscanf (p: 330)
-
- K.3.5.3.9 La función vfscanf_s (p: 597-598)
-
- K.3.5.3.11 La función vscanf_s (p: 599)
-
- K.3.5.3.14 La función vsscanf_s (p: 602)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.19.6.9 La función vfscanf (p: 293)
-
- 7.19.6.11 La función vscanf (p: 294)
-
- 7.19.6.14 La función vsscanf (p: 295)
Véase también
|
(C11)
(C11)
(C11)
|
lee entrada formateada desde
stdin
, un flujo de archivo o un búfer
(función) |
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
imprime salida formateada a
stdout
, un flujo de archivo o un búfer
usando una lista de argumentos variables (función) |
|
Documentación de C++
para
vscanf
,
vfscanf
,
vsscanf
|
|