Scanf
En C, la función scanf()
(scan-format, analizar con formato), en realidad representa a una familia de funciones que analizan una entrada de datos con formato y cargan el resultado en los argumentos que se pasan por referencia a dicha función o funciones:
- La función
scanf()
lee los datos de entrada en el stdin (flujo de entrada estándar). - La función
fscanf()
(file-scanf) lee en un flujo de entrada dado, por lo general un fichero (file) abierto para lectura. - La función
sscanf()
(string-scanf) obtiene la entrada que se va a analizar de una cadena de caracteres dada (string).
- La función
Todas ellas leen caracteres, los interpretan según un formato, y almacenan los resultados en sus argumentos. Cada uno cuenta con varios argumentos: por un lado, un formato de la secuencia del control (se describe más abajo), por otro, un sistema de argumentos del indicador que señala dónde la entrada convertida debe ser almacenada. El resultado es indefinido si hay escasos argumentos para dar formato. Si se agota el formato mientras que sigue habiendo las argumentos, los argumentos sobrantes son evaluados pero no procesados de ninguna otra manera.
Modificantes de longitud
[editar]Los modificantes de la longitud y sus significados son:
hh - Específica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador al carbón firmado o al carbón sin firmar.
h - Específica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador al cortocircuito corto o sin firmar.
l (codo) - Específica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador para desear o largo sin firmar; que una a siguiente, A, e, E, f, F, g, o specifier de la conversión de G se aplica a una argumento con el tipo indicador al doble; o que una c siguiente, s, o [el specifier de la conversión se aplica a una argumento con el tipo indicador al wchar_t.
ll (codo-codo) - Especifica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador a largo largo largo o sin firmar largo.
j - Especifica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador al intmax_t o al uintmax_t.
z - Especifica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador al size_t o al tipo correspondiente del entero con signo.
t - Especifica que specifier una d, un i, un o, un u, un x, de una conversión siguiente de X, o de n se aplica a un argumento con el tipo indicador al ptrdiff_t o al tipo sin firmar correspondiente.
L - Especifica que una a siguiente, A, e, E, f, F, g, o specifier de la conversión de G se aplica a un argumento con el tipo indicador al doble largo.
Si un modificante de la longitud aparece con cualquier specifier de la conversión con excepción de según lo especificado arriba, el comportamiento es indefinido.
Los especificadores siguientes de la conversión que son válidos
[editar]d - Empareja un número entero decimal opcionalmente con signo, que formato es igual según lo esperado para la secuencia sujeta del strtol()
con el valor 10 para el argumento bajo. En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a interno.
i - Empareja un entero con signo opcionalmente, que formato es igual según lo esperado para la secuencia sujeta del strtol()
con 0 para el argumento bajo. En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a interno.
o - Empareja un número entero octal opcionalmente con signo, que formato es igual según lo esperado para la secuencia sujeta del strtoul()
con el valor 8 para el argumento bajo. En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a sin firmar.
u - Empareja un número entero decimal opcionalmente con signo, que formato es igual según lo esperado para la secuencia sujeta del strtoul()
con el valor 10 para el argumento bajo. En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a sin firmar.
x - Empareja un número entero hexadecimal opcionalmente con signo, que formato es igual según lo esperado para la secuencia sujeta del strtoul()
con el valor 16 para el argumento bajo. En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a sin firmar.
a, e, f, g - Empareja un número, un infinito, o un NaN floating-point opcionalmente con signo, que formato es igual según lo esperado para la secuencia sujeta del strtod (). En ausencia de un modificante del tamaño, el uso se asegurará de que el argumento correspondiente sea un indicador a flotar.
>>>Si la familia del fprintf()
de funciones genera las representaciones de la cadena de caracteres para el infinito y NaN (una entidad simbólica codificada en formato floating-point) para apoyar IEEE Std 754-1985, la familia del fscanf () de funciones las reconocerá como entrada.
s - Empareja una secuencia de los octetos que no son caracteres del blanco-espacio. El uso se asegurará de que el argumento correspondiente sea un indicador al octeto inicial de un arsenal del carbón, del carbón firmado, o del carbón sin firmar bastante grande aceptar la secuencia y un código de carácter nulo que termina, que serán agregados automáticamente.
>>>Si un l (codo) calificador está presente, la entrada es una secuencia de caracteres que comienza en el estado inicial de la cambio. Cada carácter será convertido a un carácter ancho como si por una llamada a la función del mbrtowc (), con el estado de la conversión descrito por un objeto del mbstate_t inicializado a cero antes del primer carácter sea convertido. El uso se asegurará de que el argumento correspondiente sea un indicador a un arsenal de wchar_t bastante grande para aceptar la secuencia y el carácter ancho nulo que termina, que serán agregados automáticamente.
[ - Empareja una secuencia no vacía de octetos de un sistema de los octetos previstos (el scanset). Los caracteres excesivos del blanco-espacio del salto normal serán suprimidos en este caso. El uso se asegurará de que el argumento correspondiente sea un indicador al octeto inicial de un arsenal del carbón, del carbón firmado, o del carbón sin firmar bastante grande aceptar la secuencia y un octeto nulo que termina, que serán agregados automáticamente.
>>>Si un l (codo) calificador está presente, la entrada es una secuencia de caracteres que comienza en el estado inicial de la cambio. Cada carácter en la secuencia será convertido a un carácter ancho como si por una llamada a la función del mbrtowc (), con el estado de la conversión descrito por un objeto del mbstate_t inicializado a cero antes del primer carácter sea convertido. El uso se asegurará de que el argumento correspondiente sea un indicador a un arsenal de wchar_t bastante grande para aceptar la secuencia y el carácter ancho nulo que termina, que serán agregados automáticamente.
>>>La especificación de la conversión incluye todos los octetos subsecuentes en la secuencia del formato hasta e incluir el corchete derecho que empareja (“]”). Los octetos entre los corchetes (el scanlist) abarcan el scanset, a menos que el octeto después de que el corchete izquierdo sea un cricunflejo (“^”), en este caso el scanset contiene todos los octetos que no aparezcan en el scanlist entre el cricunflejo y el corchete derecho. Si la especificación de la conversión comienza con” [] “o” [^] “, el corchete derecho se incluye en el scanlist y el corchete derecho siguiente es el corchete derecho que empareja que termina la especificación de la conversión; si no, el primer corchete derecho es el que termina la especificación de la conversión. Si “-” es en el scanlist y no es el primer carácter, ni el segundo donde está un “^”, ni el carácter el primer carácter pasado, puesta en práctica-se define el comportamiento.
c - Empareja una secuencia de los octetos del número especificado por la anchura del campo (1 si no hay anchura del campo presente en la especificación de la conversión). El uso se asegurará de que el argumento correspondiente sea un indicador al octeto inicial de un arsenal del carbón, del carbón firmado, o del carbón sin firmar bastante grande aceptar la secuencia. No se agrega ningún octeto nulo. Los caracteres excesivos del blanco-espacio del salto normal serán suprimidos en este caso.
>>>Si un l (codo) calificador está presente, la entrada será una secuencia de caracteres que comienza en el estado inicial de la cambio. Cada carácter en la secuencia se convierte a un carácter ancho como si por una llamada a la función del mbrtowc (), con el estado de la conversión descrito por un objeto del mbstate_t inicializado a cero antes del primer carácter sea convertido. El uso se asegurará de que el argumento correspondiente sea un indicador a un arsenal de wchar_t bastante grande para aceptar la secuencia que resulta de caracteres anchos. No se agrega ningún carácter ancho nulo.
s - Indica que es una cadena de caracteres (string). La entrada se termina con un espacio en blanco y un carácter null es guardado al final de la cadena de caracteres. Esto significa que el buffer utilizado debe ser por lo menos un carácter más grande que la longitud de entrada especificada. De no ser así podría darse el caso que se sobrescriban porciones de memorias adyacentes, generando resultados inesperados.
/*Posibles resultados no deseados al leer un solo carácter*/ char a; scanf("%s",&a);
/*Una forma non-sancta de evitarlo usando arreglos el carácter quedaría en a[0] */ char a[2]; scanf("%s",a);
p - Empareja un sistema puesta en práctica-definido de las secuencias, que serán iguales que el sistema de secuencias que es producido por la especificación de la conversión de %p de las funciones correspondientes del fprintf (). El uso se asegurará de que el argumento correspondiente sea un indicador a un indicador a anular. La interpretación del artículo de la entrada puesta en práctica-se define. Si el artículo de la entrada es un valor convertido anterior durante la misma ejecución de programa, el indicador que los resultados compararán el igual a ese valor; si no, el comportamiento de la especificación de la conversión de %p es indefinido.
n - No se consume ninguna entrada. El uso se asegurará de que el argumento correspondiente sea un indicador al número entero en el cual será escrito el número de los octetos leídos en la entrada hasta ahora por esta llamada a las funciones del fscanf (). La ejecución de una especificación de la conversión de %n no incrementará la cuenta de la asignación vuelta en la terminación de la ejecución de la función. No se convertirá ningún argumento, pero una será consumido. Si la especificación de la conversión incluye un carácter asignación-que suprime o una anchura del campo, el comportamiento es indefinido.
Sintaxis
[editar]scanf(tipo, &var);
- tipo: Tipo de dato a almacenar
- ampersand (&) se utiliza para indicar una dirección de memoria de la variable donde se almacenará el dato. Cuando se guardan de cadenas de caracteres, al tratarse de un array de tipo char, el & se omite.
- var: variable para almacenar el dato.
Ejemplo
[editar]// Este ejemplo guarda un número en n.
int n;
printf("Introduce un numero: ");
scanf("%d",&n);
// Este ejemplo guarda un caracter en M.
char m;
printf("Introduce un caracter: ");
scanf("%c",&m);
Nota: En algunos casos, esta instrucción es ineficiente, ya que el scanf reconoce un ENTER anterior como un caracter. En estos casos se escribe la instrucción así(Nótese el espacio en blanco antes de %c):
char m;
printf("Introduce un caracter: ");
scanf(" %c",&m);
// Este ejemplo guarda una cadena de caracteres (solamente una palabra) en cad.
// Notese la ausencia de &
char cad[20];
printf("Introduce una palabra: ");
scanf("%s",cad);
printf("Introduce una palabra: ");
scanf("%10s",cad); // lee máximo 10 caracteres y le concatena el caracter cero.
Funciones derivadas
[editar]fscanf
[editar]La función fscanf
lee datos de entrada desde un fichero, en lugar de utilizar la entrada estándar.
int fscanf (FILE *file, const char *format,...);
(PHP)
int fscanf (resource file, const string format [, mixed args...]);
fscanf
trabaja igual que la función scanf
original; las entradas una vez leídas no serán leídas otra vez hasta que el archivo sea cerrado y abierto de nuevo.
sscanf
[editar]La función sscanf lee datos de entrada desde un buffer, en lugar de utilizar la entrada estándar.
Sus prototipos son los siguientes:
int sscanf (char *buffer, const char *format,...);
Retorna la cantidad de datos que pudo leer.
Recuerda que los parámetros después de *format deben ser punteros a variables donde la función dejará lo que lee. Estas variables deben tener el espacio suficiente.