SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: cobain21 en Martes 8 de Diciembre de 2009, 13:48

Título: duda principiante!!!
Publicado por: cobain21 en Martes 8 de Diciembre de 2009, 13:48
Bueno dias, me gustaría tener una solución para lo que abajo les describo...siempre me da problemas. Desde ya muchas gracias....Diego.

void IngresoMaquillaje (Maquillaje &maqui)//carga un maquillaje en ingresos
{
printf ("Ingrese la fecha:");
scan (maqui.fecha);
getchar();
printf ("nIngrese un comentario:");
scan (maqui.comentario);
getchar();
printf ("nIngrese el nombre del cliente:");
scan (maqui.cliente);
getchar();
printf ("nIngrese el precio:");
scanf ("%d", &maqui.precio);
getchar();
getchar();
system ("pause");
}


El problema es que en la ultima linea el "intro" me lo lee como un String y no me sale ingrese un precio sino que en precio me guarda la tecla "intro", se que tiene que ser facil de arreglar pero no me he podido dar cuenta...
Agradesco su colaboración....
Título: Re: duda principiante!!!
Publicado por: Eternal Idol en Martes 8 de Diciembre de 2009, 18:44
Usa fgets (con stdin) para obtener las cadenas, en el caso del numero despues aplicale un sscanf a esa cadena para obtenerlo.

Ejemplo:
Código: C++
  1. printf ("nIngrese un comentario:");
  2. fgets(maqui.comentario, sizeof(maqui.comentario), stdin);
  3. printf ("nIngrese el precio:");
  4. char line[80];
  5. fgets(line, sizeof(line), stdin);
  6. sscanf (line, "%d", &maqui.precio);
  7.  
Título: Re: duda principiante!!!
Publicado por: cobain21 en Martes 8 de Diciembre de 2009, 19:20
Eternal Idol: lo hice a tu manera y me compilo bien pero al momento de ejecutar el programa me tiraba error.
Lo hice de esta manera y me funcionó:

Código: C++
  1. void IngresoMaquillaje (Maquillaje &maqui)//carga un maquillaje en ingresos
  2. {
  3.     printf ("Ingrese la fecha:");
  4.     scan (maqui.fecha);
  5.     getchar();
  6.     fflush (stdin);
  7.     printf ("nIngrese un comentario:");
  8.     fflush (stdin);
  9.     scan (maqui.comentario);
  10.     printf ("nIngrese el nombre del cliente:");
  11.     fflush (stdin);
  12.     scan (maqui.cliente);
  13.     printf ("nIngrese el precio:");
  14.     fflush (stdin);
  15.     scanf ("%d", &maqui.precio);
  16.  
  17.  

Cualquier aclaracion o sugerencia viene bien!!!!
Muchas gracias por tu ayuda.

Saludos
Título: Re: duda principiante!!!
Publicado por: Eternal Idol en Martes 8 de Diciembre de 2009, 20:18
fflush no esta definido para flujos de entrada (como stdin) asi que no deberias usarlo. ¿Donde te daba error exactamente?
Título: Re: duda principiante!!!
Publicado por: cobain21 en Martes 8 de Diciembre de 2009, 22:43
Haber se me podes corregir...ahi me compila bien pero se me montan las salidas :Ingresar cliente, etc y despues me dice que el programa debe cerrarse porque se produjo un error. Te escribo el codigo.
Código: C++
  1. void IngresoMaquillaje (Maquillaje &maqui)//carga un maquillaje en ingresos
  2. {
  3.     printf ("Ingrese la fecha:");
  4.     fgets (maqui.fecha, sizeof (maqui.fecha), stdin);
  5.     getchar();
  6.     printf ("nIngrese un comentario:");
  7.     fgets(maqui.comentario, sizeof(maqui.comentario), stdin);
  8.     printf ("nIngrese un cliente:");
  9.     fgets(maqui.cliente, sizeof(maqui.cliente), stdin);
  10.     printf ("nIngrese el precio:");
  11.     char line[80];
  12.     fgets(line, sizeof(line), stdin);
  13.     sscanf (line, "%d", &maqui.precio);
  14. }
  15.  

Gracias
Título: Re: duda principiante!!!
Publicado por: Eternal Idol en Martes 8 de Diciembre de 2009, 23:37
¿Que compilador usas? Esto me funciona:

Código: C++
  1. #include <stdio.h>
  2.  
  3. typedef struct _Maquillaje
  4. {
  5.     char fecha[16];
  6.     char comentario[16];
  7.     char cliente[16];
  8.     int precio;
  9. }Maquillaje;
  10.  
  11. void IngresoMaquillaje (Maquillaje &maqui)//carga un maquillaje en ingresos
  12. {
  13.     printf ("Ingrese la fecha:");
  14.     fgets (maqui.fecha, sizeof (maqui.fecha), stdin);
  15.     printf ("nIngrese un comentario:");
  16.     fgets(maqui.comentario, sizeof(maqui.comentario), stdin);
  17.     printf ("nIngrese un cliente:");
  18.     fgets(maqui.cliente, sizeof(maqui.cliente), stdin);
  19.     printf ("nIngrese el precio:");
  20.     char line[80];
  21.     fgets(line, sizeof(line), stdin);
  22.     sscanf (line, "%d", &maqui.precio);
  23. }
  24.  
  25. void main()
  26. {
  27.     Maquillaje m;
  28.     IngresoMaquillaje(m);
  29.     printf("rn");
  30.     printf("fecha %s comentario %s cliente %s precio %drn", m.fecha, m.comentario, m.cliente, m.precio);
  31. }
  32.  
Título: Re: duda principiante!!!
Publicado por: player_ en Martes 8 de Diciembre de 2009, 23:49
Y por qué el getchar() del primer código no lo sustituyes por un while(getchar() != 'n');?
Título: Re: duda principiante!!!
Publicado por: cobain21 en Miércoles 9 de Diciembre de 2009, 01:00
Uso el code blocks.
Citar
Y por qué el getchar() del primer código no lo sustituyes por un while(getchar() != 'n');?

probe de esta forma, me compila bien pero se me cuelga tambien cuando ingreso la segunda linea.

yo lo tengo asi en modulos diferentes:

Código: C++
  1. typedef struct {
  2.     String fecha;
  3.     String comentario;
  4.     String cliente;
  5.     int precio;
  6. }Maquillaje;
  7.  

el "String" lo tengo hecho en otro modulo y es para que me lea he imprima las cadenas de texto, no creo que haga falta poner el codigo del String para que lo vean. El scan guarda y el print imprime.

Código: C++
  1. void IngresoMaquillaje (Maquillaje &maqui)//carga un maquillaje en ingresos
  2. {
  3.     printf ("Ingrese la fecha:");
  4.     fgets (maqui.fecha, sizeof (maqui.fecha), stdin);
  5.     while(getchar() != 'n');
  6.     printf ("nIngrese un comentario:");
  7.     fgets(maqui.comentario, sizeof(maqui.comentario), stdin);
  8.     printf ("nIngrese un cliente:");
  9.     fgets(maqui.cliente, sizeof(maqui.cliente), stdin);
  10.     printf ("nIngrese el precio:");
  11.     char line[80];
  12.     fgets(line, sizeof(line), stdin);
  13.     sscanf (line, "%d", &maqui.precio);
  14. }
  15.  

Asi fue de la unica manera que me funciono: pero he leido que no es recomendado su uso:

Código: C++
  1. void IngresoDepilacion (Depilacion &depi)//carga un maquillaje en ingresos
  2. {
  3.     printf ("Ingrese la fecha:");
  4.     scan (maqui.fecha);
  5.     getchar();
  6.     fflush (stdin);//sirve para limpiar el buffer del teclado y que no me quede el "enter" guardado
  7.     printf ("nIngrese un comentario:");
  8.     fflush (stdin);
  9.     scan (maqui.comentario);
  10.     printf ("nIngrese el nombre del cliente:");
  11.     fflush (stdin);
  12.     scan (maqui.cliente);
  13.     printf ("nIngrese el precio:");
  14.     fflush (stdin);
  15.     scanf ("%d", &maqui.precio);
  16. }
  17.  
  18.