No le encuentro el fallo. ( C )(SOLUCIONADO)

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
Xisec
Forista Menor
Forista Menor
Mensajes: 62
Registrado: Mar Jun 23, 2009 7:00 am
Ubicación: .es

No le encuentro el fallo. ( C )(SOLUCIONADO)

Mensaje por Xisec » Dom Ago 16, 2009 1:50 pm

Hola holita, estaba por aqui trasteando con C cuando... :?

1º estaba haciendo un programa que leia un numero y una letra y luego las mostraba, de momento todo bien:

Imagen

luego el ejercicio me mandaba cambiar unos pequeños matices, aqui es donde me pasa algo raro:

Imagen

La cosa es que me pide correctamente que meta un número, pero despues del 2º printf, se salta el scanf de la letra y me salta al 3º printf ::lol:: .

Esta claro que algo he hecho mal pero no lo encuentro, que todavia estoy empezando con lo de la programación estructurada y con los tipos tengo un pequeño cacao :D
Última edición por Xisec el Dom Ago 16, 2009 10:04 pm, editado 1 vez en total.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: No le encuentro el fallo. ( C )

Mensaje por akodo » Dom Ago 16, 2009 3:51 pm

Mi voto va para el carácter fin de línea. Me explico:
scanf parsea la entrada para devolver los resultados en las variables, de una forma similar a la que lo hace printf.
El caso es que, en tu primer código, lo que buscas es un número seguido de un caracter (podría ser otro número, pero tal como lo has puesto te lo consideraría parte del número y no el caracter. De todas formas no es relevante para el caso).
También has de saber que, por lo general, todos los caracteres que metes por el teclado se guardan en un buffer, y por lo general, los caracteres se empiezan a procesar al dar a la tecla "enter". También por lo general, este caracter suele ir al buffer.

Para el primer ejemplo, pones en el buffer "100A\n".
100 -> intval ; A -> charval ; \n -> permanece en el buffer.
En este caso, que \n se quede en el buffer no plantea problema, ya que no necesitas la entrada para nada más.

Para el segundo ejemplo, pones primeramente "100\n"
100 -> intval ; \n -> permanece en el buffer.
Luego, al pedir un nuevo caracter, como sigue habiendo caracteres útiles en el buffer (\n) es eso lo que te devuelve sin necesidad de "preguntar" (quedarse bloqueado esperando una entrada)

De hecho, puedes hacer una cosa un poco curiosa: en el segundo ejemplo, cuando te pida el número introduces "100A" (el número seguido de la letra). Verás cómo obtienes el primer resultado, (numero: 100, letra: A) pero no espera que introduzcas la letra.

Si te fijas, la salida que pones en el primer ejemplo es:

Código: Seleccionar todo

Letra: A
guillermo....
y en la segunda es:

Código: Seleccionar todo

Letra:

guillermo.....
Te ha puesto un cambio de línea adicional.

Para solucionar esto, puedes realizar algunos apaños:
· Consumir un caracter adicional, que sería el caracter fin de línea. Puedes hacerlo con un "getchar()" antes de pedir la letra.
· Tomar toda la entrada como una cadena de caracteres, y parsearla tú mismo. Esto es una buena idea, ya que puedes detectar errores y poner mensajes en consecuencia.
· Limpiar el buffer de entrada con "fpurge(stdin)" (creo que es eso). No detecta errores, pero sueles obtener la salida que deseas.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
Xisec
Forista Menor
Forista Menor
Mensajes: 62
Registrado: Mar Jun 23, 2009 7:00 am
Ubicación: .es

Re: No le encuentro el fallo. ( C ) (SOLUCIONADO)

Mensaje por Xisec » Dom Ago 16, 2009 4:30 pm

Arreglao, gracias akodo tio, anda que no me queda ami ni nada para captar estos errores tan "sutiles" :D :D, aunque la verdad es que lo de:
Letra:

guillermo...
era una pista gorda ::lol::

Aqui la cosa curiosa:
Imagen

Aqui la solucion:
Imagen
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: No le encuentro el fallo. ( C )

Mensaje por akodo » Dom Ago 16, 2009 7:28 pm

Tan sólo un par de notas:
· El getchar() que has puesto es la peor solución que puedes poner. Seguro que va a sonar mal lo que voy a decir, pero por algo es: a la hora de programar, piensa que el usuario que va a manejar la aplicación es subnormal. ¿Por qué? Porque se le puede ocurrir la "feliz" idea de poner como entrada al número "hhss" o "hhss100" o "100hhaa" o "ha100ah", dando al traste tu programa, o haciendo funcionar a tu programa de una manera errónea.
Evidentemente, el programa debe comportarse bien con una entrada esperada, pero también debe comportarse bien (generalmente mostrando un error) cuando no te dan una entrada válida.

· Evita poner screenshots en este foro. Para poner código usa la etiqueta "code". Al fin y al cabo, es más rápido hacer un copy&paste :wink:

· Lo del "solucionado" edítalo en el primer mensaje, que si no no se ve. :wink:
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje