sábado, 25 de febrero de 2012

Lectura de caracteres por teclado con scanf, gets y fgets


Existen varias instrucciones para leer datos de tipo cadena en C ANSI pero algunas tienen diferente forma de manejarlos, tal es el caso de la instrucción scanf, la instrucion gets y la instrucción fgets las cuales explicaremos a continuación:

Funcion scanf:

Esta función es utilizada para capturar datos ingresados por el usuario indicandole un formato del tipo de datos que se espera por pantalla, lo que quiere decir que esta funcion nos sirve para leer varios tipos de datos como lo son: int, double, char,float, etc. y la sintaxis es la siguiente:

scanf("<especificacion del tipo de dato> ",<variable en la que se almacenara el valor ingresado>);

<especificacion del tipo de dato>: en este parametro podemos incluir los siguientes que son los más básicos, recuerde que estos parametros van encerrados dentro de comillas:

"% i" :  para valores enteros
"%d" :  para valores dobles
"%f" :   para valores con punto flotante (decimales)
"%s" :  para cadenas de carácteres
"%c":  para un caracter

Ejemplo de una instruccion que lee por pantalla una valor tipo cadena y un valor tipo entero:

scanf("%s", cadena);
scanf("%i", &numero);

Si notan en la segunda instruccion se uso el simbolo "&" y en la primera no se usa, esto es porque en el scanf necesitamos indicar que es un apuntador hacia el valor que se esta ingresando y los tipos cadena ya son un apuntador por default en C mientras que los enteros no lo son y es por ello que hay que indicarlo anteponiendo el simbolo "&"

problema con cadenas: La instrucción scanf cuando lee cadenas de caracteres leera unicamente hasta donde encuentre un espacio en blanco ignorando todo el demas contenido de dicha cadena, quedando basura en el buffer de lectura y esto lo toma como otra entrada del teclado por cada espacio en blanco que encuentre.

Funcion gets:

La función gets() no hace comprobación del límite de caracteres, es decir nada impedirá al usuario teclear más caracteres de los que soporta la variable que declaramos. La consecuencia de ello es imprevisible, aunque con toda seguridad el programa no funcionará correctamente.
Es importante tener en cuenta que no se permite la asignación de cadenas de caracteres mediante el operador =frase = gets ().

La sintaxis de esta instruccion es la siguinte y solo sirve para leer cadenas de caracteres:

gets(<variable en la que se almacenara el valor ingresado>);

ejemplo:  gets(nombre);

 Esta funcion si permite el ingreso de cadenas de caractéres que poseen espacios en blanco, es decir que podemos ingresar frases completas y tomara como entrada hasta que se presione la tecla <Enter>


fgets:     char *fgets(char *cadena, int n, stdin)

Esta función lee como máximo uno menos que el número de caracteres indicado por n desde el stream apuntado por stream al array apuntado por cadena. Ningún carácter adicional es leído después del carácter de nueva línea "\n".   Un carácter nulo es escrito inmediatamente después del último carácter leído en el array.   Ejemplo para leer una cadena de 80 caracteres se debe hacer de la siguiente forma:


linea[81];  //primero mi variable debe ser de 81 porque recuerden que al final le            //insertara el caracter de fin "\0".

fgets(linea,81,stdin)  //stdin porque nuestros datos provienen del teclado, cuida                       //do porque este parametro cambia cuando la lectura es de                        //archivo 


en linea recibe 80 caracteres mas el caracter de "\0" por esa razon se declaro de tamaño 81 la variable.