Namespaces
Variants

scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

De es.cppreference.net
< c | io
 
 
Entrada/salida de archivos
Tipos y objetos
        
Funciones
Acceso a archivos
(C95)
Entrada/salida sin formato
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrada formateada
Entrada/salida directa
Salida formateada
Posicionamiento de archivos
Manejo de errores
Operaciones en archivos
 
Definido en el encabezado <stdio.h>
int scanf( const char* format, ... );
(1) (hasta C99)
int scanf( const char* restrict format, ... );
(desde C99)
int fscanf( FILE* stream, const char* format, ... );
(2) (hasta C99)
int fscanf( FILE* restrict stream, const char* restrict format, ... );
(desde C99)
int sscanf( const char* buffer, const char* format, ... );
(3) (hasta C99)
int sscanf( const char* restrict buffer, const char* restrict format, ... );
(desde C99)
int scanf_s(const char* restrict format, ...);
(4) (desde C11)
int fscanf_s(FILE* restrict stream, const char* restrict format, ...);
(5) (desde C11)
int sscanf_s(const char* restrict buffer, const char* restrict format, ...);
(6) (desde C11)

Lee datos de una variedad de fuentes, los interpreta según format y almacena los resultados en las ubicaciones dadas.

1) lee los datos de stdin
2) lee los datos del flujo de archivo stream
3) lee los datos de una cadena de caracteres terminada en nulo buffer. Alcanzar el final de la cadena es equivalente a alcanzar la condición de fin de archivo para fscanf
4-6) Igual que (1-3), excepto que los especificadores de conversión %c, %s, y %[ esperan dos argumentos cada uno (el puntero habitual y un valor de tipo rsize_t que indica el tamaño del arreglo receptor, que puede ser 1 al leer con un %c en un solo char) y excepto que los siguientes errores se detectan en tiempo de ejecución y llaman a la función gestor de restricciones instalada actualmente:
  • cualquiera de los argumentos de tipo puntero es un puntero nulo
  • format, stream, o buffer es un puntero nulo
  • el número de caracteres que escribirían %c, %s, o %[, más el carácter nulo de terminación, 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
Al igual que todas las funciones con verificación de límites, scanf_s, fscanf_s, y sscanf_s solo se garantiza que estén 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>.

Parámetros

stream - flujo de archivo de entrada del cual leer
buffer - puntero a una cadena de caracteres terminada en nulo de la cual leer
format - puntero a una cadena de caracteres terminada en nulo que especifica cómo leer la entrada
... - argumentos de recepción.


La cadena format consiste en

  • caracteres multibyte que no son espacios en blanco excepto %: cada uno de esos caracteres en la cadena de formato consume exactamente un carácter idéntico del flujo de entrada, o causa que la función falle si el siguiente carácter en el flujo no es igual.
  • caracteres de espacio en blanco: cualquier carácter de espacio en blanco en la cadena de formato consume todos los caracteres de espacio en blanco consecutivos disponibles de 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 de recepción.
  • (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 de recepción, es decir, el tipo de destino real. Esto afecta la precisión de la conversión y las reglas de desbordamiento. El tipo de destino predeterminado es diferente para cada tipo de conversión (ver tabla a continuación).
  • especificador de formato de conversión.

Los siguientes especificadores de formato están disponibles:

Conversión
especificador
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.

  • Si se usa un especificador de ancho, coincide exactamente con ancho caracteres (el argumento debe ser un puntero a un arreglo con suficiente espacio).
  • A diferencia de %s y %[, no añade el carácter nulo al arreglo.
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 sean espacios en blanco (una cadena).

  • Si se usa el especificador de ancho, coincide hasta ancho o hasta el primer carácter de espacio en blanco, lo que ocurra primero.
  • Siempre almacena un carácter nulo además de los caracteres coincidentes (por lo tanto, el arreglo argumento debe tener espacio para al menos ancho+1 caracteres).
[set ]

Coincide con una secuencia no vacía de caracteres del conjunto de caracteres.

  • Si el primer carácter del conjunto es ^, entonces se emparejan todos los caracteres que no están en el conjunto.
  • Si el conjunto comienza con ] o ^], entonces el carácter ] también se incluye en el conjunto.
  • Está definido por la implementación si el carácter - en una posición no inicial en el conjunto de escaneo puede indicar un rango, como en [0-9].
  • Si se usa el especificador de ancho, solo coincide hasta ancho.
  • Siempre almacena un carácter nulo además de los caracteres coincidentes (por lo tanto, el arreglo argumento debe tener espacio para al menos ancho+1 caracteres).
d

Coincide con un entero decimal.

  • El formato del número es el mismo que espera strtol con el valor 10 para el argumento base.
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*
intmax_t* o uintmax_t*
size_t*
ptrdiff_t*
N/A
b (C23)

Coincide con un entero binario sin signo.

  • El formato del número es el mismo que espera strtoul con el valor 2 para el argumento base.
i

Coincide con un entero.

  • El formato del número es el mismo que espera strtol con el valor 0 para el argumento base (la base se determina por los primeros caracteres analizados).
u

Coincide con un entero decimal sin signo.

  • El formato del número es el mismo que espera strtoul con el valor 10 para el argumento base.
o

Coincide con un entero octal sin signo.

  • El formato del número es el mismo que espera strtoul con el valor 8 para el argumento base.
x
X

Coincide con un entero hexadecimal sin signo.

  • El formato del número es el mismo que espera strtoul con el valor 16 para el argumento base.
n

Devuelve el número de caracteres leídos hasta ahora.

  • No se consume entrada. No incrementa el contador de asignaciones.
  • Si el especificador tiene definido el operador de supresión de asignación, el comportamiento no está definido.
a (C99)
A (C99)
e
E
f
F (C99)
g
G

Coincide con un número de punto flotante.

  • El formato del número es el mismo que espera strtof.
N/A N/A
float*
double*
N/A N/A N/A N/A
long double*
p

Coincide con una secuencia de caracteres definida por la implementación que define un puntero.

  • printf Las funciones de la familia %p deberían producir la misma secuencia usando el especificador de formato
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 excede ningún ancho de campo especificado y que es exactamente lo que el especificador de conversión espera o es un prefijo de una secuencia que esperaría, es lo que se consume del flujo. El primer carácter, si lo hay, después de esta secuencia consumida permanece sin leer. Si la secuencia consumida tiene longitud cero o si la secuencia consumida no se puede convertir como se especificó anteriormente, ocurre un fallo de coincidencia a menos que el final del archivo, un error de codificación o un error de lectura hayan impedido la entrada del flujo, en cuyo caso es un fallo de entrada.

Excepto por el especificador %, el elemento de entrada (o, para %n, el recuento de caracteres de entrada) se convierte primero a un tipo apropiado para el especificador de conversión. A menos que la asignación se haya suprimido con *, el resultado de la conversión se escribe en el objeto al que apunta el siguiente argumento que aún no se ha escrito. Si este objeto no tiene un tipo apropiado, o si el resultado de la conversión no se puede representar en el objeto, el comportamiento no está definido.

Todos los especificadores de conversión que no sean [, c, y n consumen y descartan todos los caracteres de espacio en blanco iniciales (determinado como si se llamara a isspace en un bucle) antes de intentar analizar la entrada. Estos caracteres consumidos no cuentan para el ancho máximo de campo 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 que se convierta 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 arreglo 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 arreglo de destino, es tan inseguro como gets.

Las especificaciones de conversión correctas para los tipos enteros de ancho fijo (int8_t, etc.) se definen en el encabezado <inttypes.h> (aunque SCNdMAX, SCNuMAX, etc. son sinónimos de %jd, %ju, etc.).

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 "sumidero".

Al analizar un valor de punto 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 número de punto flotante posiblemente válido) se consume, resultando en un error de coincidencia (la secuencia consumida no se puede convertir a un número de punto flotante), quedando "r". 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 no es válida, el comportamiento no está definido.

Si una especificación de conversión no es válida, el comportamiento no está definido.

Valor de retorno

1-3) Número de argumentos de recepción asignados correctamente (que puede ser cero en caso de que ocurra un fallo de coincidencia antes de que se asignara el primer argumento de recepción), o EOF si ocurre un fallo de entrada antes de que se asignara el primer argumento de recepción.
4-6) Igual que (1-3), excepto que EOF también se devuelve si hay una violación de restricción en tiempo de ejecución.

Complejidad

No garantizada. Notablemente, algunas implementaciones de sscanf son O(N), donde N = strlen(buffer) [1].

Notas

Debido a que la mayoría de los especificadores de conversión primero consumen todos los espacios en blanco consecutivos, código como

scanf("%d", &a);
scanf("%d", &b);

leerá dos enteros que se ingresan en líneas diferentes (el segundo %d consumirá el salto de línea dejado por el primero) o en la misma línea, separados por espacios o tabuladores (el segundo %d consumirá los espacios o tabuladores).

Los especificadores de conversión que no consumen espacios en blanco iniciales, como %c, pueden hacerlo usando un carácter de espacio en blanco en la cadena de formato:

scanf("%d", &a);
scanf(" %c", &c); // consume all consecutive whitespace after %d, then read a char

Ejemplo

#define __STDC_WANT_LIB_EXT1__ 1
#include <locale.h>
#include <stddef.h>
#include <stdio.h>

int main(void)
{
    int i, j;
    float x, y;
    char str1[10], str2[4];
    wchar_t warr[2];
    setlocale(LC_ALL, "en_US.utf8");

    char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";
    /* parse as follows:
       %d: an integer
       %f: a floating-point value
       %9s: a string of at most 9 non-whitespace characters
       %2d: two-digit integer (digits 5 and 6)
       %f:  a floating-point value (digits 7, 8, 9)
       %*d: an integer which isn't stored anywhere
       ' ': all consecutive whitespace
       %3[0-9]: a string of at most 3 decimal digits (digits 5 and 6)
       %2lc: two wide characters, using multibyte to wide conversion  */
    int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
                     &i, &x, str1, &j, &y, str2, warr);

    printf("Converted %d fields:\n"
           "i = %d\n"
           "x = %f\n"
           "str1 = %s\n"
           "j = %d\n"
           "y = %f\n"
           "str2 = %s\n"
           "warr[0] = U+%x\n"
           "warr[1] = U+%x\n",
           ret, i, x, str1, j, y, str2, warr[0], warr[1]);

#ifdef __STDC_LIB_EXT1__
    int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1);
    // writes 25 to i, 5.432 to x, the 9 bytes "Thompson\0" to str1, and 3 to n.
#endif
}

Posible salida:

Converted 7 fields:
i = 25
x = 5.432000
str1 = Thompson
j = 56
y = 789.000000
str2 = 56
warr[0] = U+df
warr[1] = U+6c34

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.6.2 La función fscanf (p: TBD)
  • 7.21.6.4 La función scanf (p: TBD)
  • 7.21.6.7 La función sscanf (p: TBD)
  • K.3.5.3.2 La función fscanf_s (p: TBD)
  • K.3.5.3.4 La función scanf_s (p: TBD)
  • K.3.5.3.7 La función sscanf_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.6.2 La función fscanf (p: 231-236)
  • 7.21.6.4 La función scanf (p: 236-237)
  • 7.21.6.7 La función sscanf (p: 238-239)
  • K.3.5.3.2 La función fscanf_s (p: 430-431)
  • K.3.5.3.4 La función scanf_s (p: 432)
  • K.3.5.3.7 La función sscanf_s (p: 433)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.6.2 La función fscanf (p: 317-324)
  • 7.21.6.4 La función scanf (p: 325)
  • 7.21.6.7 La función sscanf (p: 326)
  • K.3.5.3.2 La función fscanf_s (p: 592-593)
  • K.3.5.3.4 La función scanf_s (p: 594)
  • K.3.5.3.7 La función sscanf_s (p: 596)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.6.2 La función fscanf (p: 282-289)
  • 7.19.6.4 La función scanf (p: 290)
  • 7.19.6.7 La función sscanf (p: 291)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.6.2 La función fscanf
  • 4.9.6.4 La función scanf
  • 4.9.6.6 La función sscanf

Véase también

lee entrada formateada desde stdin, un flujo de archivo o un búfer
usando lista de argumentos variables
(función)
obtiene una cadena de caracteres de un flujo de archivo
(función)
imprime salida formateada en stdout, un flujo de archivo o un búfer
(función)
Documentación de C++ para scanf, fscanf, sscanf