Namespaces
Variants

wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s

From cppreference.net
< c ‎ | io
Definido en el encabezado <wchar.h>
(1)
int wscanf ( const wchar_t * format, ... ) ;
(desde C95)
(hasta C99)
int wscanf ( const wchar_t * restrict format, ... ) ;
(desde C99)
(2)
int fwscanf ( FILE * stream, const wchar_t * format, ... ) ;
(desde C95)
(hasta C99)
int fwscanf ( FILE * restrict stream,
const wchar_t * restrict format, ... ) ;
(desde C99)
(3)
int swscanf ( const wchar_t * buffer, const wchar_t * format, ... ) ;
(desde C95)
(hasta C99)
int swscanf ( const wchar_t * restrict buffer,
const wchar_t * restrict format, ... ) ;
(desde C99)
int wscanf_s ( const wchar_t * restrict format, ... ) ;
(4) (desde C11)
int fwscanf_s ( FILE * restrict stream,
const wchar_t * restrict format, ... ) ;
(5) (desde C11)
int swscanf_s ( const wchar_t * restrict s,
const wchar_t * restrict format, ... ) ;
(6) (desde C11)

Lee datos de una variedad de fuentes, los interpreta de acuerdo con format y almacena los resultados en las ubicaciones indicadas.

1) Lee los datos desde stdin .
2) Lee los datos del flujo de archivo stream .
3) Lee los datos de la cadena ancha terminada en nulo buffer . Alcanzar el final de la cadena equivale a alcanzar la condición de fin de archivo para fwscanf
4-6) Igual que (1-3) , excepto que % c , % s , y % [ esperan cada uno dos argumentos (el puntero habitual y un valor de tipo rsize_t que indica el tamaño del array receptor, que puede ser 1 al leer con % lc en un único carácter ancho) y excepto que los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejadora de restricciones actualmente instalada:
  • 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 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 todas las funciones con verificación de límites, wscanf_s , fwscanf_s , y swscanf_s solo 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 <wchar.h> .

Contenidos

Parámetros

stream - flujo de archivo de entrada desde el cual leer
buffer - puntero a una cadena ancha terminada en nulo desde la cual leer
format - puntero a una cadena ancha terminada en nulo que especifica cómo leer la entrada
... - argumentos receptores.


La cadena de formato consiste en

  • caracteres anchos 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 iswspace 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→
%
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 utiliza un especificador de ancho, coincide exactamente con ancho caracteres anchos (el argumento debe ser un puntero a un array con espacio suficiente).
  • A diferencia de %s y %[, no añade el carácter nulo al array.
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 ).

  • Si se utiliza el especificador de ancho, coincide hasta width 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 que el array de argumentos debe tener espacio para al menos width+1 caracteres).
[ set  ]

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

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

Coincide con un entero decimal .

  • El formato del número es el mismo que se espera por wcstol 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 *
N/A
i

Coincide con un entero .

  • El formato del número es el mismo que el esperado por wcstol 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 se espera por wcstoul 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 el esperado por wcstoul 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 el esperado por wcstoul con el valor 16 para el argumento base .
n

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

  • No se consume ninguna entrada. No incrementa el contador de asignaciones.
  • Si el especificador tiene definido el operador de supresión de asignación, el comportamiento es indefinido.
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 se espera por wcstof .
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 .

  • printf la familia de funciones debería producir la misma secuencia usando %p 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 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 iswspace ) antes de intentar analizar la entrada. Estos caracteres consumidos no cuentan para el ancho de campo máximo especificado.

Si no se utiliza el especificador de longitud l , los especificadores de conversión c , s , y [ realizan la conversión de caracteres de ancho a multibyte como si se llamara a wcrtomb 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 <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 "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

1-3) Número de argumentos receptores asignados exitosamente, o EOF si ocurre un fallo de lectura antes de que se asignara el primer argumento receptor.
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.

Ejemplo

#include <stdio.h>
#include <wchar.h>
#include <string.h>
#define NUM_VARS   3
#define ERR_READ   2
#define ERR_WRITE  3
int main(void) {
    wchar_t state[64];
    wchar_t capital[64];
    unsigned int population = 0;
    int elevation = 0;
    int age = 0;
    float pi = 0;
#if INTERACTIVE_MODE
    wprintf(L"Ingrese estado, edad y valor de pi: ");
    if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error leyendo entrada.\n");
        return ERR_READ;
    }
#else
    wchar_t* input = L"California 170 3.141592";
    if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error leyendo entrada.\n");
        return ERR_READ;
    }
#endif
    wprintf(L"Estado: %ls\nEdad  : %d años\nPi   : %.5f\n\n", state, age, pi);
    FILE* fp = tmpfile();
    if (fp) {
        // escribir algunos datos al archivo temporal
        if (!fwprintf(fp, L"Mississippi Jackson 420000 807")) {
            fprintf(stderr, "Error escribiendo al archivo.\n");
            fclose(fp);
            return ERR_WRITE;
        }
        // rebobinar puntero del archivo
        rewind(fp);
        // leer datos en variables
        fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation);
        wprintf(L"Estado  : %ls\nCapital: %ls\nPoblación de Jackson (en 2020): %u\n"
                L"Elevación máxima: %d pies\n",
                state, capital, population, elevation);
        fclose(fp);
    }
}

Salida posible:

Estado: California
Edad  : 170 años
Pi   : 3.14159
Estado  : Mississippi
Capital: Jackson
Población de Jackson (en 2020): 420000
Elevación máxima: 807 pies

Referencias

  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.29.2.2 La función fwscanf (p: 410-416)
  • 7.29.2.4 La función swscanf (p: 417)
  • 7.29.2.12 La función wscanf (p: 421)
  • K.3.9.1.2 La función fwscanf_s (p: 628-629)
  • K.3.9.1.5 La función swscanf_s (p: 631)
  • K.3.9.1.14 La función wscanf_s (p: 638)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.24.2.2 La función fwscanf (p: 356-362)
  • 7.24.2.4 La función swscanf (p: 362)
  • 7.24.2.12 La función wscanf (p: 366-367)

Véase también

lee entrada formateada de caracteres anchos desde stdin , un flujo de archivo
o un búfer usando una lista de argumentos variables
(función)
Documentación de C++ para wscanf , fwscanf , swscanf