[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: problema con scanf (novato)



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!!! ;-)



Reply to: