Duda con ejecución de programa C en terminal

Buenas, tengo un programa realizado en C que recoge datos por teclado para luego realizar unas acciones.El problema que tengo es que los 3 primeros datos que pido con scanf me los recoge bien, el programa se para que los introduzca pero después con los siguientes no para y corre la ejecución hasta el final sin dejarme introducirlos.

El código lo tengo realizado de este estilo:

printf("Introducir el valor:\t");
scanf("%u", &variable);
fflush(stdin);


no sé si será por el fflush, no tengo mucha experiencia en C y no sé porque pasa esto.
Como no pongas toda la parte relevante.....

No meteras valores incorrectos, no? Si a eso le introduces una letra, la lias XD
fflush(stdin) es para windows.

Usa un getchar() en vez del flush(stdin)
Buscando un poco he encontrado esta solucion...


void fflush_in(void)
{
        int car;
        while( (car = fgetc(stdin)) != EOF && car != '\n' ){}
}




usar esta función en vez de fflush(stdin);

la funcion fflush en linux solo sirve para el bufer de salida
Usa getline.

ssize_t getline(char ** restrict linep, size_t * restrict linecapp, FILE * restrict stream);


Te pongo el código que te vendría bien:

char *s = NULL;
size_t size=0;

printf("Introducir el valor:\t");
getline(&s, &size, stdin); //Tu string recogido por teclado se guarda en s.

//Aquí haces lo necesario con s

free(s); //Liberamos el malloc hecho por getline
s = NULL; //Por si quieres volver a usarlo.


Si vas a usar varias veces getline, repite el free y la asignación a NULL por cada vez que la emples.

No uses scanf, es una basura.
getline es una funcion para c++ y no para ansi c
minius escribió:Buenas, tengo un programa realizado en C que recoge datos por teclado para luego realizar unas acciones.El problema que tengo es que los 3 primeros datos que pido con scanf me los recoge bien, el programa se para que los introduzca pero después con los siguientes no para y corre la ejecución hasta el final sin dejarme introducirlos.

El código lo tengo realizado de este estilo:

printf("Introducir el valor:\t");
scanf("%u", &variable);
fflush(stdin);


no sé si será por el fflush, no tengo mucha experiencia en C y no sé porque pasa esto.


En Linux fflush(stdin) hay veces que funciona y veces que no, yo ya no lo uso. Limpia la stdin con

int ch;
while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}


y ya esta.

Donato escribió:Usa getline.

ssize_t getline(char ** restrict linep, size_t * restrict linecapp, FILE * restrict stream);


Te pongo el código que te vendría bien:

char *s = NULL;
size_t size=0;

printf("Introducir el valor:\t");
getline(&s, &size, stdin); //Tu string recogido por teclado se guarda en s.

//Aquí haces lo necesario con s

free(s); //Liberamos el malloc hecho por getline
s = NULL; //Por si quieres volver a usarlo.


Si vas a usar varias veces getline, repite el free y la asignación a NULL por cada vez que la emples.

No uses scanf, es una basura.


Hasta donde yo se, getline es de C++. Y por cierto, scanf sera una basura, pero es una basura que funciona y es lo que enseñan en primero de carrera para leer datos donde yo estudio XD yo por suerte ya uso C++. cin y esas cosas.
6 respuestas