Borrar buffer , como funciona getchar

Iniciado por Jomad205, 12 Noviembre 2012, 16:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Jomad205

Hola, muy buenos dias a todos:
Pues bien, escribo este tema porque no entiendo bien el uso del while con la funcion getchar para proceder a la limpieza del buffer.  Es mas no estoy seguro de comprender bien cual es el objetivo de la limpieza del buffer.

Entiendo por buffer, un espacio reservado en la memoria (volatil) para una determinada información del programa. Supongo que si no se limpiase quedarían restos que no nos beneficiarian a lo largo de un programa. Como he dicho hace un momento 'supongo'.

He encontrado en este mismo foro una mención al tema, pero o bien creo que no se llego a resolver lo que se preguntaba o yo no lo he entendido.
http://foro.elhacker.net/programacion_cc/iquestpara_que_sirve_la_funcion_getchar-t200224.0.html

En la documentación que tengo , hay varios ejemplos, voy a poner nada mas que 2 porque no me gustaría saturar el mensaje con información innecesaria:

#include <stdio.h>

main(void)
{
char letra='0',c;

while (!(letra >= 'a' && letra <=  'z' || letra >= 'A' && letra <=  'Z'))
{
printf("\nEste programa únicamente admite letras\n");
printf("Introduce una letra: ");
scanf("%c", &letra);
while((c=getchar())!= '\n');
printf("\n\n\n");
}
printf("¡Por fin UNA LETRA!");
printf("\n\nLa letra introducida ha sido: %c", letra);
printf("\n\n\n\n");
}

Que dice así :

/*La condición de while puede referirse a caracteres. Por ejemplo, programa que pide una letra
mientras el carácter que introduzcamos sea diferente de una letra. La instrucción while((c=getchar())!= '\n'),
sirve para borrar el buffer (comentando esa línea e introduciendo caracteres que no sean letras al ejecutar
el programa, se puede comprobar la necesidad de borrar el buffer) y es otro ejemplo del uso de while*/


#include <stdio.h>

main()
{
char entrar;
int nc=0;

printf("Introducir caracteres. Pulsar ctrl+D para terminar: ");
while (entrar != EOF)
{
entrar = getchar();
if (entrar != '\n') nc++;
}
printf("\nEl numero de caracteres es: %d\n",nc);
}


Y este otro seria un ejemplo de un programa que para darse por finalizado habría que pulsar CNTRL+Z (EOF) en windows o CNTRL+D en linux. Lo que haría sería contar cada uno de los caracteres que introducimos, pero no contaría los ENTER.

Debo decir que hasta ahora no habóa visto la función getchar, con lo que es desconocida para mi.

Y aquí termino, lamento si me he extendido demasiado. ¡Gracias de antemano!

EDITO: Tambien entra a la mitad de todo esto en utilizar fgets() y sscanf() para evitarnos borrar el buffer, pero como es suficiente de momento el lío que tengo respecto a esto, me parecía rizar el rizo añadirlo.

Ferno

Básicamente, cuando vos ingresás datos por pantalla, tenés que pulsar el enter para que se procese la información.

Ahora bien, el buffer va a tomar tanto los datos que vos ingresaste como el enter (caracter '\n'). Obviamente, ese caracter de salto de línea no es parte de los datos que vos querías ingresar, por ende, es necesario eliminarlo!

Si por ejemplo estás en un loop donde en cada corrida utilizas una función para leer del buffer de entrada (getchar() es un ejemplo), llega un momento que lee solo ese caracter de salto de línea, cosa que no estaría bien, porque vos no querías ingresar dicho caracter (a menos claro, que hubieses querido ingresarlo :P).

En resumen, el buffer siempre va a tener lo que vos ingresás, y el caracter de salto de línea que también ingresas para que empiece a procesar la información. Lo que se le denomina "limpiar el buffer" es justamente, eliminar el caracter de salto de línea que queda en el buffer al momento de ingresar información por pantalla, y así el programa puede seguir pidiendo información al usuario (notar que si ve que el buffer no está "vacío", no pide datos al usuario como debería, sino que tomaría ese caracter de salto de línea como el dato que ingresa el usuario).

Espero que se haya entendido un poco más.

Jomad205

Ajá! Creo que ahora lo comprendo mejor, te lo agradezco :) Trataré de buscar algo más de información al respecto :) Gracias!!