Compartir vía


Especificación del ancho scanf

Esta información se aplica a la interpretación de cadenas de formato en la familia de funciones scanf, incluidas las versiones seguras, como scanf_s. Por lo general, estas funciones asumen que la secuencia de entrada se divide en una secuencia de tokens. Los tokens está separados por espacios en blanco (espacio, tabulación o nueva línea), o en el caso de los tipos numéricos, mediante el final natural de un tipo de datos numérico, como indica el primer carácter que no se puede convertir en texto numérico. Sin embargo, la especificación de ancho puede utilizarse para hacer que se detenga el análisis de la entrada antes del fin natural de un token.

La especificación width consta de caracteres entre el carácter % y el especificador de campo de tipo, que puede incluir un entero positivo denominado campo width y uno o varios caracteres que indican el tamaño del campo, que también pueden considerarse como modificadores del tipo del campo, como una indicación de si el tipo de entero es short o long. Dichos caracteres se conocen como el prefijo de tamaño.

El campo width.

El campo width es un entero decimal positivo que controla el número máximo de caracteres que se leen para ese campo. No se convierte ni almacena un número mayor de caracteres width en el elemento argument correspondiente. Puede que se lean menos caracteres width si hay un carácter de espacio en blanco o un carácter que no se puede convertir según el formato especificado antes de que se llegue a width.

La especificación del ancho es independiente y diferente del argumento de tamaño de búfer requerido por las versiones seguras de estas funciones (por ejemplo, scanf_s, wscanf_s, etc.). En el siguiente ejemplo, la especificación de ancho es de 20, que indica que se leerá un máximo de 20 caracteres del flujo de entrada. La longitud del búfer es de 21, que incluye espacio para los 20 posibles caracteres más el terminador nulo:

char str[21];
scanf_s("%20s", str, 21);

Si el campo width no se usa, scanf_s intenta leer todo el token en la cadena. Si el tamaño especificado no es lo suficientemente grande como para contener todo el token, no se escribirá nada en la cadena de destino. Si se especifica el campo width, los primeros caracteres width del token se escribirán en la cadena de destino junto con el terminador nulo.

El prefijo de tamaño

Los prefijos opcionales h, hh, l, ll, I64 y L indican el tamaño del elemento argument (largo o corto, carácter de un solo byte o carácter ancho, según el carácter de tipo que modifiquen). Estos caracteres de especificación de formato se utilizan con caracteres de tipo en las funciones scanf o wscanf para especificar la interpretación de los argumentos tal como se muestra en la siguiente tabla. El prefijo I64 de tipo es una extensión de Microsoft y no es compatible con Standard C. Los caracteres de tipo y sus significados se describen en la tabla "Caracteres de tipo para funciones scanf" en scanf caracteres de campo de tipo.

Nota:

Los prefijos h, l y L son extensiones de Microsoft cuando se usan con datos de tipo char.

Prefijos de tamaño para scanf y especificadores de tipo de formato wscanf

Para especificar Usar prefijo Con especificador de tipo
double l e, E, f, g o G
long double (igual que double) L e, E, f, g o G
long int l d, i, o, x o X
long unsigned int l u
long long ll d, i, o, x o X
short int h d, i, o, x o X
short unsigned int h u
char hh d, i, o, x o X
unsigned char hh u
int64 I64 d, i, o, u, x o X
Carácter de un solo byte con scanf h c o C
Carácter de un solo byte con wscanf h c o C
Carácter ancho con scanf l c o C
Carácter ancho con wscanf l c o C
Cadena de caracteres de un solo byte con scanf h s o S
Cadena de caracteres de un solo byte con wscanf h s o S
Cadena de caracteres anchos con scanf l s o S
Cadena de caracteres anchos con wscanf l s o S

En los siguientes ejemplos se usa h y l con funciones scanf_s y funciones wscanf_s:

scanf_s("%ls", &x, 2);     // Read a wide-character string
wscanf_s(L"%hC", &x, 2);    // Read a single-byte character

Si utiliza una función no segura de la familia scanf, omita el parámetro de tamaño que indica la longitud del búfer del argumento anterior.

Lectura de cadenas no delimitadas

Para leer cadenas no delimitadas por caracteres de espacio en blanco, se puede sustituir un conjunto de caracteres entre corchetes ([ ]) por el carácter de tipo s (cadena). El conjunto de caracteres entre corchetes se conoce como cadena de control. El campo de entrada correspondiente se lee hasta el primer carácter que no aparece en la cadena de control. Si el primer carácter del conjunto es un símbolo de intercalación (^), se invierte el efecto: el campo de entrada se lee hasta el primer carácter que aparece en el resto del conjunto de caracteres.

Tanto %[a-z] como %[z-a] se interpretan como equivalentes a %[abcde...z]. Es una extensión de función común scanf, pero no es necesaria en C estándar.

Lectura de cadenas sin terminar

Para almacenar una cadena sin almacenar un carácter de terminación nulo ('\0'), use la especificación %Nc, donde N es un entero decimal. En este caso, el carácter de tipo c indica que el argumento es un puntero a una matriz de caracteres. Los siguientes N caracteres se leen desde el flujo de entrada en la ubicación especificada y no se anexa ningún carácter nulo ('\0'). Si no se especifica N, su valor predeterminado es 1.

Cuando scanf deja de leer un campo

La función scanf examina cada campo de entrada, carácter a carácter. Puede dejar de leer un campo de entrada concreto antes de llegar a un carácter de espacio por diversos motivos:

  • Se ha alcanzado el ancho especificado.

  • No se puede convertir el siguiente carácter según lo especificado.

  • El siguiente carácter entra en conflicto con un carácter de la cadena de control con el que se supone que debe coincidir.

  • El siguiente carácter no aparece en un juego de caracteres determinado.

Por algún motivo, cuando la función scanf deja de leer un campo de entrada, se considera que el siguiente campo de entrada comienza en el primer carácter no leído. El carácter en conflicto, si existe, se considera no leído. Es el primer carácter del siguiente campo de entrada o el primer carácter de posteriores operaciones de lectura en el flujo de entrada.

Consulte también

scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
Campos de especificación de formato: scanf y wscanf funciones
scanf Caracteres del campo de tipo