Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 30 Agosto 2016, 00:44 am



Título: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
Publicado por: palacio29 en 30 Agosto 2016, 00:44 am
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").



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void CARGA (char nombre[5][20],int arreglo[5][8]);
  5.  
  6. int main()
  7. {
  8.  
  9.    char nombre[5][20];
  10.    int arreglo[5][8];
  11.    CARGA(nombre,arreglo);
  12.  
  13.  
  14.  
  15.   return 0;
  16. }
  17.  
  18.  
  19.  
  20.  
  21.  
  22. void CARGA (char nombre[5][20],int arreglo[5][8])
  23. {
  24.      int i=0,total=0,ganado=0,empate=0,perdido=0,favor=0,contra=0,dif=0,puntito=0;
  25.  
  26.    while (i<5)
  27.    {
  28.        printf ("Ingrese el nombre del equipo: ");
  29.        fgets(nombre[i],20,stdin);
  30.        printf ("Ingrese la cantidad de partidos jugados: ");
  31.        scanf("%d",&total);
  32.        printf ("Ingrese la cantidad de partidos ganados: ");
  33.        scanf("%d",&ganado);
  34.        printf ("Ingrese la cantidad de partidos empatados: ");
  35.        scanf("%d",&empate);
  36.        printf ("Ingrese la cantidad de partidos perdidos : ");
  37.        scanf("%d",&perdido);
  38.        printf ("Ingrese la cantidad de goles a favor:  ");
  39.        scanf ("%d",&favor);
  40.        printf ("Ingrese la cantidad de goles en contra:  ");
  41.        scanf ("%d",&contra);
  42.        dif=favor-contra;
  43.        puntito=3*ganado+empate;
  44.  
  45.        arreglo[i][0]=puntito;
  46.        arreglo[i][1]=total;
  47.        arreglo[i][2]=ganado;
  48.        arreglo[i][3]=empate;
  49.        arreglo[i][4]=perdido;
  50.        arreglo[i][5]=favor;
  51.        arreglo[i][6]=contra;
  52.        arreglo[i][7]=dif;
  53.        i++;
  54.    }
  55. }
  56.  

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.


Título: Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
Publicado por: 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


Título: Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
Publicado por: palacio29 en 30 Agosto 2016, 01:45 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 ;-) ;-) ;-)


Título: Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
Publicado por: n-utz en 1 Septiembre 2016, 14:54 pm
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?


Título: Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
Publicado por: AlbertoBSD en 1 Septiembre 2016, 17:14 pm
getchar solo procesa un caracter. Por ejemplo si ingresas:

Código:
"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:

Código:
"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:

Código
  1. char texto[20];
  2. int numero;
  3. printf("Ingrese un numero: ");
  4. fgets(texto,20,stdin);
  5. numero = strtol(texto,NULL,10);


Saludos!