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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  While duplica printf(fgets)(sscanf)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: While duplica printf(fgets)(sscanf)  (Leído 1,879 veces)
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
While duplica printf(fgets)(sscanf)
« 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 anio...:");
  17.        fgets(cadena, 5, stdin);
  18.        sscanf(cadena, "%d", &aaaa);
  19.   }
  20. }
Desde ya muchas gracias por la ayuda que puedan brindarme.-
Un saludo.


En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: While duplica printf(fgets)(sscanf)
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: While duplica printf(fgets)(sscanf)
« Respuesta #2 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.
En línea

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.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pregunta sobre sscanf(); ??? (RESUELTO)
Programación C/C++
ralymontes 4 3,693 Último mensaje 13 Noviembre 2011, 18:42 pm
por ralymontes
EOF y sscanf (SOLUCIONADO)
Programación C/C++
ricardo2013 0 1,394 Último mensaje 11 Octubre 2012, 11:00 am
por ricardo2013
Instruccion sscanf [C]
Programación C/C++
oblivionxor 6 3,104 Último mensaje 26 Febrero 2013, 20:36 pm
por oblivionxor
Duda sobre sscanf y strtok
Programación C/C++
antolinalvaro 1 1,502 Último mensaje 1 Agosto 2018, 15:11 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines