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

Problema con scanf

Estas en el tema de Problema con scanf en el foro de C/C++ en Foros del Web. Buen dia, les hago la siguiente consulta: en mi programita tengo primero un switch para seleccionar determinada opcion: int main() { int opcion; printf("\ingresar 1 ...
  #1 (permalink)  
Antiguo 28/05/2014, 20:00
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 10 años, 6 meses
Puntos: 0
Problema con scanf

Buen dia, les hago la siguiente consulta: en mi programita tengo primero un switch para seleccionar determinada opcion:

int main() {

int opcion;

printf("\ingresar 1 para blah, ingresar 2 para bleh...");

scanf("%d",&opcion);

switch(opcion)

{

case 1:
calcular();
break;




Hasta ahi todo bien, pero cuando llamo a la funcion calcular () , {esta pide nuevamente un scanf esperando un char, pero corriendo el programa lo saltea y pasa directamente a la proxima linea, por lo que se es que me acepta como char al enter que pulse en el ultimo switch. Saben como puedo resolverlo??? gracias!


aca les dejo la parte de la funcion que saltea:

char opcion;

printf("\n\nIngresar la operacion\n\n");

scanf("%c",&opcion); <-- lo saltea y pasa directamente al proximo

printf("\n\nIngresar los dos numeros\n\n");
scanf("%f",&a);
scanf("%f",&b);
  #2 (permalink)  
Antiguo 28/05/2014, 20:27
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema con scanf

Está muy desorganizado el código. Escríbelo todo junto nuevamente, si es posible con las indentaciones (sangrías) necesarias. Y explícanos qué quieres que realice exactamente el código.
  #3 (permalink)  
Antiguo 28/05/2014, 21:19
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con scanf

hola amigo.
bueno talvez puede ser por que declaras dos veces la misma variable opcion ami en lo pesonal no me gusta hacer eso aun que este en funciones por que luego me han dado errores por eso asi que intenta cambiar el nombre.

como dice celtic7 deberias de poner el codigo ompleto para darte respuestas mas precisas.
Saludos.
Drewermerc.
  #4 (permalink)  
Antiguo 28/05/2014, 23:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con scanf

acabo de comentar un problema parecido aquí mismo XDD http://www.forosdelweb.com/f96/probl...nes-c-1100363/

va del dichozo buffer ese problema.
el buffer almacena todo hasta que pulsar enter. Y enter nada mas es que una letra '\n'

cuando el programa pide un numero
scanf("%d",&opcion);

y por ejemplo entramos el 22 ¿Que pasa si enter es un char? pues que se queda en el bufer.

entonces la funcion que pide un char lo obtiene el \n y tu a ver navios XD scanf("%c",&opcion);

pues si no quieres tener problema puedes ignorar ese enter haciendo asi cuando te pida un numero.

scanf("%d%*c", &opcion);

el primero %d toma el numero y el segundo %*c ignora el caracter el * delante del especificador de formato hace que lo ignore o sea *c quiere decir *=ignorar c=char

otra forma de ignorarlo es si vas a entrar un numero tener una variable muerta:

int num;
char muerta;

scanf("%d%c", &num, &muerto);

entonces el numero se meterá en num y enter en muerto XDD

y por ejemplo si haces un getch() pon 2 getch seguidos

num=getch();
getch();

hay muchas formas de ignorar ese enter muerto en el buffer, es solo buscar por Internet "como limpiar el buffer en c"

Suerte ;)
  #5 (permalink)  
Antiguo 29/05/2014, 08:16
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema con scanf

OK, les paso el codigo mas completo:

primero el menu de seleccion, donde hago el primer switch:

#include<stdio.h>

int calcular ();

int main() {

int opcion;

printf("\n\nIngresar opcion:\n1 para calculo de 2 numeros con un operando\n2 para factorial\n3 para exponencial\n4 para calculos trigonometricos\n5 para conversion a hexadecimal/binario \n\n");

scanf("%d",&opcion);

switch(opcion)

{

case 1:
calcular();
break;

default:
printf("\nOtra opcion\n");

}


ES un menu para elejir que operaciones hacer, si elije la opcion 1 va al programa de calculo para 2 variables y 1 operador que es el siguiente:

int calcular() {

float a,b;

char operador;

printf("\n\nIngresar la operacion\n");

scanf("%c",&operador);

printf("\n\nIngresar los dos numeros\n\n");
scanf("%f",&a);
scanf("%f",&b);

switch(operador)
{
case '+':
suma(a,b);
break;


Y sigue con muchas mas cuentas, pero cuando lo corro me saltea el scanf pidiendo el operador...
  #6 (permalink)  
Antiguo 29/05/2014, 13:14
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con scanf

bueno pues una solcion si hacer limpiesa de buffer lo que yo hago es que ignore \n scanf pero tambien funciona solo cambiando el tipo de valor de %c a %s y con eso se soluciona o tra opcion megor es usar funciones como fgets solo que aqui tienes que usar arrays.
Saludos.
Drewermerc.
  #7 (permalink)  
Antiguo 29/05/2014, 16:24
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con scanf

Bueno amigo ya lo repase pero como no lo has puesto el código entero te lo dire los fallos que vi.
1º En a algunos switch te olvidas poner los casos por defecto (default), y siempre hay que ponerlos ¿ok?

2º lo de que no te funcione es por el case 1: que debe poner los '' entre el 1... case '1':
cuando vayas tomar una sola letra puedes usar getch o getchar. Con getch al elegir 1 no hace falta pulsar el enter así que puede que te guste mas, el problema es cuando vas ingresar mas de una letra o numero como 233 que getch solo toma la primera causando error, pero para elegir es perfecta ;)

Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. int calcular ();
  4. void suma ( float a, float b );
  5.  
  6. int main() {
  7.  
  8.     int opcion = 0;
  9.    
  10.    
  11.     printf ( "Ingresar opcion:\n1 para calculo de 2 numeros con un operando\n2 para factorial\n3 para exponencial\n4 para calculos trigonometricos\n5 para conversion a hexadecimal/binario \n\n" );
  12.    
  13.     opcion = getche();
  14.    
  15.     switch ( opcion ) {
  16.    
  17.         case '1':
  18.             calcular();
  19.             break;
  20.            
  21.         default:
  22.             printf ( "\nOtra opcion\n" );
  23.             break; // Te falto el break aqui Debes ponerlo tambien en default
  24.            
  25.     }
  26.    
  27. }
  28.  
  29.  
  30. int calcular(){
  31.     float a, b;
  32.     char operador, enter;
  33.    
  34.     printf ( "\nIngresar la operacion\n" );
  35.     operador = getche();
  36.        
  37.     printf ( "\nIngresar primer numero: " );
  38.     //scanf("%f %c", &a, &enter);
  39.     scanf("%f", &a);
  40.     printf ( "\nIngresar segundo numero: " );
  41.     scanf("%f", &b);
  42.    
  43.    
  44.     switch ( operador ) {
  45.         case '+':
  46.             suma ( a, b );
  47.             break;
  48.            
  49.         default:
  50.             printf ( "\nSiempre debe llevar default\n" );
  51.             break; // Siempre poner break;
  52.            
  53.            
  54.            
  55.     }
  56. }
  57.  
  58. void suma ( float a, float b ){
  59.     printf("%f + %f = %f", a, b, (a+b) );
  60. }

Si ves algún problema mas dilo que aquí seguimos intentando solucionar XD
suerte!

Etiquetas: funcion, int, numero, programa, scanf
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 03:33.