elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta)En el While se saltea el Fgets o el Gets Nose porque
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta)En el While se saltea el Fgets o el Gets Nose porque  (Leído 2,889 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
(Consulta)En el While se saltea el Fgets o el Gets Nose porque
« 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.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
« Respuesta #1 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


En línea

palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
« Respuesta #2 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 ;-) ;-) ;-)
En línea

n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
« Respuesta #3 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?
« Última modificación: 1 Septiembre 2016, 15:02 pm por n-utz » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: (Consulta)En el While se saltea el Fgets o el Gets Nose porque
« Respuesta #4 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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Esta consulta mysql si nose como hacerla :S
Bases de Datos
mark182 2 3,094 Último mensaje 25 Septiembre 2011, 22:41 pm
por seba123neo
[CONSULTA] ¿Porqué no puedo usar más de tres teclas?
Windows
kenshiNN 0 1,602 Último mensaje 8 Noviembre 2014, 02:16 am
por kenshiNN
[Ayuda][C++] Se saltea el primer comando
Programación C/C++
sabeeee 8 3,685 Último mensaje 1 Febrero 2015, 03:12 am
por flony
(Consulta) Funcion FgetS en arreglo bidemensional
Programación C/C++
palacio29 2 1,798 Último mensaje 29 Agosto 2016, 14:09 pm
por AlbertoBSD
(Consulta) Porque no me funciona gets(string)
Programación C/C++
palacio29 2 3,559 Último mensaje 28 Agosto 2016, 20:22 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines