Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] No entiendo poruqe pasa esto

Estas en el tema de No entiendo poruqe pasa esto en el foro de C/C++ en Foros del Web. Hola, este e smi primer tema, soy nuevo en esto de la programacion y no se porque cuando ejecuto este programa sin errores me salta ...
  #1 (permalink)  
Antiguo 08/09/2013, 14:56
 
Fecha de Ingreso: septiembre-2013
Ubicación: Valencia
Mensajes: 4
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta No entiendo poruqe pasa esto

Hola, este e smi primer tema, soy nuevo en esto de la programacion y no se porque cuando ejecuto este programa sin errores me salta la parte de introducir caracter:

Código:
#include <stdio.h>

int main(){
//declarar variables:
long int a;
float b;
char c;
//pedir datos de las variables(input/output)

//de la variable entera
printf("Dame un valor numerico para a\n");
scanf("%d",&a);
//%d-> el tipo de datos que se va a introducir/&a->en nombre de la varible.

//de la variable flotante
printf("Dame un valor decimal para b\n");
scanf("%g",&b);
//%f-> el tipo de datos que se va a introducir/&b->en nombre de la varible.

//de la variable caracter
printf("Dame una letra para c\n");
scanf("%c",&c);
//%c-> el tipo de datos que se va a introducir/&c->en nombre de la varible.

//se imprimen los datos introducidos
printf("El valor de la variable de tipo entero es: %d\n",a);
printf("El valor de la variable de tipo flotante es: %g\n",b);
printf("El valor de la variable de tipo caracter es: %c\n",c);

return 0;
}
Gracias de antemano
  #2 (permalink)  
Antiguo 08/09/2013, 16:51
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: No entiendo poruqe pasa esto

Lo escribiste vos eso? La función "scanf" es la que pide la entrada por teclado.

  #3 (permalink)  
Antiguo 08/09/2013, 16:58
 
Fecha de Ingreso: septiembre-2013
Ubicación: Valencia
Mensajes: 4
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: No entiendo poruqe pasa esto

Si, lo escribí yo. Yo lo veo todo correcto, lo que no entiendo es que cuando ejecuto e introduzco los datos de las variables a y b se salta la de c y termina el programa sin pedirme que introduza datos en la variable de caracter, la c
  #4 (permalink)  
Antiguo 08/09/2013, 19:06
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: No entiendo poruqe pasa esto

Hola Tapasa.

Es por que queda almacenada la secuencia de escape '\n' en el buffer de teclado, para evitarlo:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void clearbuff(); // vaciar buffer de teclado
  4.  
  5. int main(){
  6.   long int a;
  7.   float b;
  8.   char c;
  9.  
  10.   printf("Dame un valor numerico para a: ");
  11.   scanf("%ld", &a);
  12.   clearbuff();
  13.  
  14.   printf("\nDame un valor decimal para b: ");
  15.   scanf("%g", &b);
  16.   clearbuff();
  17.  
  18.   printf("\nDame una letra para c : ");
  19.   scanf("%c", &c);
  20.   clearbuff();
  21.  
  22.   printf("\nEl valor de la variable de tipo entero es: %ld\n",a);
  23.   printf("El valor de la variable de tipo flotante es: %g\n",b);
  24.   printf("El valor de la variable de tipo caracter es: %c\n",c);
  25.  
  26.   getchar();
  27.   return 0;
  28. }
  29.  
  30. // vaciar buffer de teclado
  31. void clearbuff()
  32. {
  33.   while((getchar())!= '\n');
  34. }

Saludos.
  #5 (permalink)  
Antiguo 08/09/2013, 19:10
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 4 meses
Puntos: 25
Respuesta: No entiendo poruqe pasa esto

No encuentro las palabra para detallar el problema que tenes, pero pasa en que en c se guarda el ENTER y se pasa de largo el scanf. Vas a encontrar una mejor explicación aquí:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4. //declarar variables:
  5. long int a;
  6. float b;
  7. char c;
  8. //pedir datos de las variables(input/output)
  9.  
  10. //de la variable entera
  11. printf("Dame un valor numerico para a\n");
  12. scanf("%d",&a);
  13. //%d-> el tipo de datos que se va a introducir/&a->en nombre de la varible.
  14.  
  15. //de la variable flotante
  16. printf("Dame un valor decimal para b\n");
  17. scanf("%g",&b);
  18. //%f-> el tipo de datos que se va a introducir/&b->en nombre de la varible.
  19.  
  20. //de la variable caracter
  21. printf("Dame una letra para c\n");
  22. scanf(" %c",&c);
  23. //%c-> el tipo de datos que se va a introducir/&c->en nombre de la varible.
  24.  
  25. //se imprimen los datos introducidos
  26. printf("El valor de la variable de tipo entero es: %d\n",a);
  27. printf("El valor de la variable de tipo flotante es: %g\n",b);
  28. printf("El valor de la variable de tipo caracter es: %c\n",c);
  29.  
  30.  
  31. return 0;
  32. }

La solución sería colocar un espacio en blanco en el scanf que lee el carácter, para que se pase de largo el enter que quedo en el buffer al ingresar el número decimal.


Saludos.
  #6 (permalink)  
Antiguo 09/09/2013, 05:22
 
Fecha de Ingreso: septiembre-2013
Ubicación: Valencia
Mensajes: 4
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: No entiendo poruqe pasa esto

Muchas gracias, ya funciona.
He entendido lo que he dicho ecfisa pero no lo he hecho, he hecho lo uqe ha dicho starfix de poner un espacio en scanf, al principio no lo entendi pero ahora ya caigo, gracias otravez.
  #7 (permalink)  
Antiguo 09/09/2013, 05:38
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 4 meses
Puntos: 46
Respuesta: No entiendo poruqe pasa esto

Bueno, este digamos que es el tipico problema que afronta todo programador de C cuando empieza y se da de golpes contra el input/output de C xD

Las soluciones de los otros compañeros son buenas y funcionan, pero yo quiero aportar otra solucion, ya que creo que es mas "correcta". Se trata de en vez de tratar de hacer hacks para que la funcion scanf funcione como queramos, usar funciones que funcionan bien, sin necesitad de hacer ningun truco extraño.

Estas dos funciones son por un lado fgets, que nos permite leer una cadena de un fichero, o en este caso del stdin, es decir del input del usuario y la otra sscanf, sí, con dos 's'. Esta función nos permite transformar la cadena que obtenemos en este caso a un entero.

Así que un ejemplo de lectura sería:
Código C:
Ver original
  1. ...
  2. char cad[10];
  3. int a;
  4. fgets(cad,sizeof(cad),stdin);
  5. sscanf(cad,"%d",&a);

Y así tendriamos el número que el usuario ha entrado en la variable a.

Pero si eres un buen programador vago como deben ser los programadores dirás: Y cada vez que quiera leer un numero tengo que hacer eso, buf que palo...

Aquí es donde entra en juego hacer una función propia, aquí tienes dos opciones, que són más que nada estéticas dependiendo de si quieres leer los números así:
(nuestra función se llamará myscanf())
Código C:
Ver original
  1. int a = myscanf();
o como la scanf normal, es decir así:
Código C:
Ver original
  1. int a;
  2. myscanf("%d",&a);

Así que ahora procedo a poner las dos funciones, que simplemente tienes que poner en tu código y llamar cuando quieras obtener un valor numerico:
myscanf1, esta es la que no requiere ningun parámetro y devuelve un entero:
Código C:
Ver original
  1. int myscanf()
  2. {
  3.     char cad[10];
  4.     int a;
  5.     fgets(cad,sizeof(cad),stdin);
  6.     sscanf(cad,"%d",&a);
  7.    
  8.     return a;
  9. }

Por otro lado, si lo que quieres es usar esta función como si fuera la propia scanf, usa esta función:
Código C:
Ver original
  1. void myscanf2(char *a, int *b)
  2. {
  3.     char cad[10];
  4.     fgets(cad,sizeof(cad),stdin);
  5.     sscanf(cad,a,b);
  6. }

Bueno, si tienes alguna duda con alguna de las funciones, no dudes en preguntar :)

Última edición por L3m0n; 09/09/2013 a las 05:45
  #8 (permalink)  
Antiguo 09/09/2013, 07:09
 
Fecha de Ingreso: septiembre-2013
Ubicación: Valencia
Mensajes: 4
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: No entiendo poruqe pasa esto

Pua, lo he entendido, y si, yo que soy vago me da mucho palo hacer eso, jeje.
Al final lo he hecho todo en C++, he cambiado todo el codigo. así:
Cita:
#include <iostream>

int main(){
//declarar variables:
int a;
float b;
char c;
//pedir datos de las variables(input/output)

//de la variable entera
std :: cout << "Dame un valor numerico para a\n " << std :: endl ;
std :: cin >> a ;
//%d-> el tipo de datos que se va a introducir/&a->en nombre de la varible.

//de la variable flotante
std :: cout << "Dame un valor decimal para b\n" << std :: endl ;
std :: cin >> b ;
//%f-> el tipo de datos que se va a introducir/&b->en nombre de la varible.

//de la variable caracter
std :: cout << "Dame una letra para c\n" << std :: endl ;
std :: cin >> c ;//pongo un espacio antes de "%c" para que scanf no coja el enter //tambien se puede crear una funcion que limpie el bufer del teclado: void clearbuff(); y llamarla asi cuando quiera limpiarlo: clearbuff();
//%c-> el tipo de datos que se va a introducir/&c->en nombre de la varible.

//se imprimen los datos introducidos
std :: cout << "El valor de la variable de tipo entero es: " << a << "\n" << std :: endl ;
std :: cout << "El valor de la variable de tipo flotante es: " << b << "\n" << std :: endl ;
std :: cout << "El valor de la variable de tipo caracter es: " << c << "\n" << std :: endl ;

return 0;
}
Y funciona, no como lo otro que hice, que si funciona, pero esto no me da problemas

Etiquetas: int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:12.