scanf (Especificación de ancho)

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

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éricos, tal como se indica mediante 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 del ancho consta de caracteres entre el % y el especificador de campo de tipo, que puede incluir un entero positivo denominado el campo ancho 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 e es corto o largo. Dichos caracteres se conocen como el prefijo de tamaño.

El campo ancho 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 de ancho en el argument correspondiente. Puede que se lean menos caracteres de ancho si hay un carácter de espacio en blanco (espacio, tabulación o nueva línea) o un carácter que no se puede convertir según el formato especificado antes de que se llegue al ancho.

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 (es decir,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 ancho no se usa, scanf_s intentará 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 ancho, los primeros caracteres de ancho del token se escribirán en la cadena de destino junto con el terminador nulo.

Los prefijos opcionales h, l, ll, I64 y L indican el tamaño del 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 de tipo I64 es una extensión de Microsoft y no es compatible con ANSI. Los caracteres de tipo y sus significados se describen en la tabla “Caracteres de tipo para las funciones scanf” en scanf (Caracteres de campo de tipo).

System_CAPS_ICON_note.jpg Nota

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

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

Para especificarUsar prefijoCon especificador de tipo
doublele, E, f, g o G
long double(igual que double)Le, E, f, g o G
long intld, i, o, x o X
long unsigned intlu
long longlld, i, o, x o X
short inthd, i, o, x o X
short unsigned inthu
__int64I64d, i, o, u, x o X
Carácter de un solo byte con scanfhc o C
Carácter de un solo byte con wscanfhc o C
Carácter ancho con scanflc o C
Carácter ancho con wscanflc o C
Cadena de caracteres de un solo byte con scanfhs o S
Cadena de caracteres de un solo byte con wscanfhs o S
Cadena de caracteres anchos con scanfls o S
Cadena de caracteres anchos con wscanfls o S

Los siguientes ejemplos usan h y l con funciones scanf_s y 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.

Para leer cadenas que no son 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.

Tenga en cuenta que se interpreta que % [a-z] y % [z-a] son equivalentes a %[abcde...z]. Esta es una extensión común de la función scanf, pero tenga en cuenta que el estándar ANSI no la requiere.

Para almacenar una cadena sin almacenar un carácter de terminación nulo ('\0'), utilice la especificación %nc, donden 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 caracteres n 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.

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 conflictivo, si es que lo hay, se considera no leído y es el primer carácter del siguiente campo de entrada o el primer carácter en posteriores operaciones de lectura en el flujo de entrada.

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

Mostrar: