Ramiro Aceves wrote:
segmentation fault escribi�:
Bueno la versi�n que mand� antes me parece que ten�a
comentarios de m�s, esta es la buena:
#include <stdio.h>
#include <stdio_ext.h>
#include <unistd.h>
#include <stdlib.h>
int N;
int a;
float dato;
char buffer;
char respuesta1,respuesta2,respuesta3;
int main(void){
printf("mete un float\n");
scanf("%f",&dato);
__fpurge(stdin);
printf("has metido : %f\n",dato);
printf("ahora los getchar\n");
respuesta1 = getchar();
__fpurge(stdin);
respuesta2 = getchar();
__fpurge(stdin);
respuesta3=getchar();
__fpurge(stdin);
printf("caracter1: %c caracter2: %c caracter3: %c\n",\
respuesta1,respuesta2,respuesta3);
exit(0);
}
Estupendo, muchas gracias, esta funciona perfectamente, aunque hay
que darle de comer m�s cabeceras.. :-) He buscado lo del __fpurge en
el glibc-doc en html y s� que viene (ayer anduve dando vueltas por ah�
y no lo v�, estoy medio ciego)
De todas formas, es incre�ble la que hay que montar para hacer una
cosa tan sencilla como leer un car�cter. Lo curioso es que en la
p�gina del man de getchar no dice nada de esto, y podr�a haber
advertido de toda esta serie de problemas.
En tu versi�n hay que dar a intro en los tres getchar(). En la
original, escribir tres letras y un solo intro....Estoy hecho un l�o.
Muchas gracias.
Ramiro.
Vamos a ver, en la version original al poner tres getchar() seguidos se
leer�n los primeros
tres caracteres que introduzcas por teclado. Teniendo en cuenta que el
intro se considera
un caracter, al introducir "abcINTRO" se leer� "abc". Pero en el
buffer de entrada seguir�
quedando "INTRO". Si en lugar de esto se introdujera
"aINTRObINTROcINTRO", lo que
leer�an los tres getchar ser�a "aINTROb".
En mi version, teniendo en cuenta que cada getchar() lee un s�lo
caracter, lo que se hace
es: Introducimos por teclado los caracteres "aINTRO".Entonces en el
buffer de entrada
tendremos "aINTRO". Como cada getchar() lee un caracter, leer� el
primero del buffer, es
decir "a". Antes de hacer el siguiente getchar() hacemos __fpurge(), con
lo cual vaciamos el
buffer, por lo tanto en este momento no hay nada en el buffer de
entrada. Al hacer el segundo
getchar(), el programa se encontrar� con el buffer vac�o, es decir, no
tiene datos nuevos en el
buffer para leer, entonces esperar� a que se los introduzcas por
teclado, por ejemplo "bINTRO".
El proceso se repite...............
Por otro lado, el fflush() NO vac�a el buffer, NO borra los datos del
buffer. Lo que hace es
escribir los datos que encuentra en el buffer de entrada (memoria) en un
almacenamiento
persistente (disco) para evitar que se pierdan, pero los datos siguen
quedando en el buffer
de entrada.
Espero haberte ayudado algo, el C es un lenguaje algo complicado al
empezar, pero con el tiempo
llega a ser apasionante y realmente muy potente.
Salu2 y hasta la pr�xima!!! ;-)