Compartir a través de


scanf (Especificación de ancho)

Esta información se aplica a la interpretación de cadenas de formato en la familia de scanf de funciones, incluidas las versiones seguras como scanf_s. Estas funciones se supone normalmente que el flujo de entrada se divide en una secuencia de tokens. El final natural de un tipo de datos numérico separan los tokens por el espacio en blanco (espacio, pestaña, o nueva línea), o en el caso de tipos numéricos, como se indica en el primer carácter que no se puede convertir en texto numérico. Sin embargo, la especificación de ancho se puede utilizar para realizar el análisis de entrada para detener antes del fin natural de un símbolo.

La especificación de ancho consta de los caracteres entre % y el especificador de campo de tipo, que pueden incluir un entero positivo denominado campo de ancho y uno o más caracteres que indican el tamaño del campo, el que también puede considerarse como modificadores del tipo de campo, como una indicación de si el tipo integer es corto o long. Estos caracteres se denominan el prefijo de tamaño.

El campo de ancho

El campode ancho es un entero decimal positivo que controla el número máximo de caracteres que se leerá para ese campo. No más que los caracteres de ancho se convierten y almacenadas en argumentcorrespondiente. Menos que los caracteres de ancho pueden leer si un carácter de espacio en blanco (espacio, pestaña, o nueva línea) o un carácter que no se pueden convertir según el formato dado aparece antes de alcanzar el ancho .

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

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

Si el campo de ancho no se utiliza, scanf_s intentará leer el símbolo completo en la cadena. Si el tamaño especificado no es lo bastante grande para contener el símbolo completo, no se escribirá nada en la cadena de destino. Si se especifica el campo de ancho , los primeros caracteres del ancho del símbolo se escriben en la cadena de destino junto con el terminador nulo.

El prefijo de tamaño

Los prefijos opcionales h, l, ll, I64, y L indican el tamaño de argument (long o short, carácter de solo- byte o carácter ancho, dependiendo del carácter de tipo que modifican). Estos caracteres de la formato- especificación se utilizan con los caracteres escritos en scanf o wscanf funciona para especificar la interpretación de argumentos como se muestra en la tabla siguiente. El prefijo I64 de tipo es una extensión de Microsoft y no es compatible con ANSI. Los caracteres de tipo y sus significados se describen en el tipo que los caracteres para scanf” tabla en scanf (Caracteres de campo de tipo).

Nota

h, l, y los prefijos de L son extensiones de Microsoft cuando se utiliza con datos de charescrito.

Prefijos de tamaño de los especificadores del tipo de formato scanf y de wscanf

Para especificar

Usar prefijo

Con especificador de tipo

double

l

h, E, z, d, o G

long double (igual que doble)

L

h, E, z, d, o G

int largo

l

x, i, o, x, o X

unsigned int largo

l

u

long long

ll

x, i, o, x, o X

short int

h

x, i, o, x, o X

unsigned int abreviada

h

u

int64

I64

x, i, o, b, x, o X

Carácter de Solo- byte con scanf

h

cC

Carácter de 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

Solo- byte (cadena de caracteres con scanf

h

C o S

Solo- byte (cadena de caracteres con wscanf

h

C o S

Cadena de caracteres con scanf

l

C o S

Cadena de caracteres con wscanf

l

C o S

Los ejemplos siguientes utilizan h y l con las funciones de scanf_s y las funciones de wscanf_s :

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

Si se utiliza una función unsecure en la familia de scanf , se omite el parámetro size que indica la longitud del búfer del argumento anterior.

Cadenas de Undelimited de lectura

Para leer cadenas no delimitadas por los caracteres de espacio en blanco, un conjunto de caracteres en corchetes ([ ]) puede ser sustituido por el carácter de tipo C (cadena). Hacen referencia al conjunto de caracteres entre corchetes como cadena de control. El campo de entrada correspondiente se lee hasta el primer carácter que no aparece en la cadena del 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 juego de caracteres.

Observe que %[a-z] y %[z-a] se interpretarán como equivalente a %[abcde...z]. Esto es una extensión común de la función de scanf , pero observe que el estándar ANSI no lo requiere.

Cadenas de e indefinida de lectura

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

Cuando scanf finaliza la lectura de un campo

La función de scanf examina cada campo de entrada, carácter por carácter. Puede detener la lectura de un campo de entrada determinado antes de alcanzar un carácter de espacio por varias razones:

  • Se ha alcanzado el ancho especificado.

  • El carácter siguiente no se puede convertir especificadas.

  • El carácter siguiente está en conflicto con un carácter de la cadena del control que está supuesto coincidir.

  • El carácter siguiente no puede aparezca en un juego de caracteres especificado.

Por cualquier razón, cuando la función de scanf finaliza la lectura de un campo de entrada, el campo de entrada siguiente se considera empezar en el primer carácter no leídos. El carácter en conflicto, si hay alguno, se considera no leídos y es el primer carácter del campo de entrada siguiente o el primer carácter de operaciones de lectura subsiguientes en el flujo de entrada.

Vea también

Referencia

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)