Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 4 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Mar Jun 23, 2009 7:00 am
Mensajes: 62
Ubicación: .es

Nota Publicado: Dom Ago 16, 2009 1:50 pm 
Arriba  
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
 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Dom Ago 16, 2009 3:51 pm 
Arriba  
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:
Letra: A
guillermo....

y en la segunda es:
Código:
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Mar Jun 23, 2009 7:00 am
Mensajes: 62
Ubicación: .es

Nota Publicado: Dom Ago 16, 2009 4:30 pm 
Arriba  
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:

Citar:
Letra:

guillermo...


era una pista gorda ::lol::

Aqui la cosa curiosa:
Imagen

Aqui la solucion:
Imagen

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Dom Ago 16, 2009 7:28 pm 
Arriba  
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 4 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
No encuentro la carpeta incoming (SOLUCIONADO)

en Software

pez136

6

3339

Sab Nov 06, 2010 3:32 pm

pez136 Ver último mensaje

Fallo Grub (SOLUCIONADO)

[ Ir a página: 1, 2 ]

en Instalación de distribuciones

clamide

19

2175

Dom Nov 14, 2010 6:29 pm

mcun Ver último mensaje

Fallo de sonido, Debian. [solucionado]

en Software

Kenton

2

795

Dom Dic 28, 2014 12:43 am

Kenton Ver último mensaje

Fallo en actualizacion, Sparky [solucionado]

en Software

Kenton

11

1583

Jue Ene 15, 2015 5:08 pm

cargoan Ver último mensaje

Fallo iniciando actualizacion, Korora. (Solucionado)

en Software

Zamana

4

1007

Jue Ago 22, 2013 7:33 pm

Zamana Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO