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