(Consulta)En el While se saltea el Fgets o el Gets Nose porque

Iniciado por palacio29, 30 Agosto 2016, 00:44 AM

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

palacio29

Tengo que hacer un listado de equipos de futbol con sus respectivos puntos, partidos ganados, etc. El problema es que por el momento estoy haciendo la carga y en la primera pasada del ciclo va perfecto, ahora cuando empieza nuevamente se saltea la funcion fgets...Lo intente con fgets y con gets y ninguno de los 2 cambia el resultado.


El problema esta en esta linea 29.
En este caso puedo poner el fgets como lo puse o puedo poner "gets(nombre").



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void CARGA (char nombre[5][20],int arreglo[5][8]);

int main()
{

    char nombre[5][20];
    int arreglo[5][8];
    CARGA(nombre,arreglo);



   return 0;
}





void CARGA (char nombre[5][20],int arreglo[5][8])
{
      int i=0,total=0,ganado=0,empate=0,perdido=0,favor=0,contra=0,dif=0,puntito=0;

    while (i<5)
    {
        printf ("Ingrese el nombre del equipo: ");
        fgets(nombre[i],20,stdin);
        printf ("Ingrese la cantidad de partidos jugados: ");
        scanf("%d",&total);
        printf ("Ingrese la cantidad de partidos ganados: ");
        scanf("%d",&ganado);
        printf ("Ingrese la cantidad de partidos empatados: ");
        scanf("%d",&empate);
        printf ("Ingrese la cantidad de partidos perdidos : ");
        scanf("%d",&perdido);
        printf ("Ingrese la cantidad de goles a favor:  ");
        scanf ("%d",&favor);
        printf ("Ingrese la cantidad de goles en contra:  ");
        scanf ("%d",&contra);
        dif=favor-contra;
        puntito=3*ganado+empate;

        arreglo[i][0]=puntito;
        arreglo[i][1]=total;
        arreglo[i][2]=ganado;
        arreglo[i][3]=empate;
        arreglo[i][4]=perdido;
        arreglo[i][5]=favor;
        arreglo[i][6]=contra;
        arreglo[i][7]=dif;
        i++;
    }
}


Quizas es algo muy tonto pero no es la primera vez que me pasa y se hacerlo sin usar fgets o gets pero mi intencion ya que hace muy poco descubri estas funciones, es aprovecharla y ahorrar codigo.

AlbertoBSD

El problema esta al revolver fgets y los scanf, los scanf no procesan el ultimo Enter por lo cual es como si quedara en la entrada, al momento de leer con el fgets por segunda ves, entra el enter y se salta ese fgets...


Soluciones:


  • No usar scanf
  • agregar un getchar despues del ultimo scanf para omitir el ultimo retorno de Linea
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

palacio29

Cita de: AlbertoBSD en 30 Agosto 2016, 00:52 AM
El problema esta al revolver fgets y los scanf, los scanf no procesan el ultimo Enter por lo cual es como si quedara en la entrada, al momento de leer con el fgets por segunda ves, entra el enter y se salta ese fgets...


Soluciones:


  • No usar scanf
  • agregar un getchar despues del ultimo scanf para omitir el ultimo retorno de Linea

Que genio, nunca se me hubiera ocurrido ;-) ;-) ;-)

n-utz

#3
Iba a postear, pero leí este post y tengo la misma duda.

Me estaba pasando exactamente lo mismo con los scanf, el primero pedia un dato y el segundo era ignorado. Al leer este post reemplacé ambos por getchar(), y me sigue sucediendo lo mismo, el primero lo lee y el segundo es ignorado.

El código es sencillo, no creo que haga falta postearlo, simplemente quiero pedir dos caracteres por teclado, el primero lo hago sin problemas, el segundo es ignorado.

EDITADO: Veamos, "solucione" como decian arriba, poniendo un getchar luego de cada scanf para que procese el enter, pero mi duda ahora es. Usando getchar unicamente sin scanf me seguia sucediendo lo mismo, tiene el mismo problema que scanf? que funcion me conviene usar para pedir caracteres?

AlbertoBSD

getchar solo procesa un caracter. Por ejemplo si ingresas:

"1"

Realmente estas ingresando un '1' en ascii y no un uno en decimal ya que getchar no procesa la entrada y scanf si.

Ademas realmente se esta ingresando:

"1\n"

Y el 1 lo procesa el primer getchar y queda de todos modos un "enter"

La otra forma es leer una linea de texto y  procesar la cadena manualmente con atoi o strtol

Ejemplo:

char texto[20];
int numero;
printf("Ingrese un numero: ");
fgets(texto,20,stdin);
numero = strtol(texto,NULL,10);



Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW