While duplica printf(fgets)(sscanf)

Iniciado por DanielPy, 7 Noviembre 2013, 15:30 PM

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

DanielPy

CitarHago 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.-

if(opciones == 1){
    while(dd < 1 || dd > 31){
        printf("\n ingrese dia...:");
        fgets(cadena, 3, stdin);
        sscanf(cadena, "%d", &dd);
    }
    d_d = 1;
    while(mm < 1 || mm > 12){
        printf("\n ingrese mes...:");
        fgets(cadena, 3, stdin);
        sscanf(cadena, "%d", &mm);
    }
    m = mm;

    while(aaaa < 1 || aaaa > 9999){
        printf("\n ingrese año...:");
        fgets(cadena, 5, stdin);
        sscanf(cadena, "%d", &aaaa);
   }
}

Desde ya muchas gracias por la ayuda que puedan brindarme.-
Un saludo.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

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:
int opciones;
int dd;
int ok;
int ch;

/* ... */

if (opciones == 1){
   do {
      puts("Ingrese dia:"); /* las lineas TERMINAN en '\n', no al reves */
      ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
     
      /* Se descarta el resto de la linea */
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }while (!ok);
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-