Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 7 Noviembre 2013, 15:30 pm



Título: While duplica printf(fgets)(sscanf)
Publicado por: DanielPy en 7 Noviembre 2013, 15:30 pm
Citar
Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-

Hola a todos.
Debo aclarar que hace un día que estoy asiéndole cambios al código y Buscando en google, en este momento me doy por vencido y recurro a Uds. El caso es que el siguiente while me duplica en muchos casos los printf, bueno está todo dicho, si necesitan el código completo por favor me lo solicitan.-

Código
  1. if(opciones == 1){
  2.    while(dd < 1 || dd > 31){
  3.        printf("\n ingrese dia...:");
  4.        fgets(cadena, 3, stdin);
  5.        sscanf(cadena, "%d", &dd);
  6.    }
  7.    d_d = 1;
  8.    while(mm < 1 || mm > 12){
  9.        printf("\n ingrese mes...:");
  10.        fgets(cadena, 3, stdin);
  11.        sscanf(cadena, "%d", &mm);
  12.    }
  13.    m = mm;
  14.  
  15.    while(aaaa < 1 || aaaa > 9999){
  16.        printf("\n ingrese año...:");
  17.        fgets(cadena, 5, stdin);
  18.        sscanf(cadena, "%d", &aaaa);
  19.   }
  20. }
Desde ya muchas gracias por la ayuda que puedan brindarme.-
Un saludo.


Título: Re: While duplica printf(fgets)(sscanf)
Publicado por: rir3760 en 7 Noviembre 2013, 16:26 pm
Un problema en ese fragmento es utilizar fgets indicando una capacidad de tres caracteres, como la función reserva uno para el avance de linea y otro para el terminador de la cadena (el '\0') solo resta un carácter para la linea y difícilmente se leerá esta completa.

Otro problema es no verificar si la linea leída termina con '\n' indicando que se leyó la linea completa, de no ser así tendrás, de todos modos, que utilizar un bucle para descartar el resto de la linea.

En tu caso es mejor tratar de leer el numero de tipo int con scanf y a continuación utilizar un bucle para descartar el resto de la linea:
Código
  1. int opciones;
  2. int dd;
  3. int ok;
  4. int ch;
  5.  
  6. /* ... */
  7.  
  8. if (opciones == 1){
  9.   do {
  10.      puts("Ingrese dia:"); /* las lineas TERMINAN en '\n', no al reves */
  11.      ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
  12.  
  13.      /* Se descarta el resto de la linea */
  14.      while ((ch = getchar()) != EOF && ch != '\n')
  15.         ;
  16.   }while (!ok);
  17. }

Un saludo


Título: Re: While duplica printf(fgets)(sscanf)
Publicado por: DanielPy en 7 Noviembre 2013, 17:40 pm
Hola rir3760
Genio, funciona a la perfección.-
Quiero hacer un pequeño párrafo con respecto a todo lo bueno que haces por los demás, estuve leyendo unas cuantas respuestas tuyas y realmente demostras que tenes muchísimo conocimientos de C, si en algún momento alguien se olvidó de agradecerte por alguna ayuda yo lo hago en este momento por todos ellos, seguí así, sos de los tipos que cualquiera quisiera tener sentado al lado frente a la pc.(estudiando C)   

Muchas gracias.-
Un saludo.