[C con Clase] Problemas con "Switch"

Omar Murray esomy_m en yahoo.es
Vie Mayo 4 19:21:59 CEST 2007


Gracias Ismael, he hecho las modificaciones que me has dicho y sucedió
una cosa curiosa:

Probé el código en la faculdad compilando con el Borland y anduvo sin
problemas...
Ahora en mi portatil con gcc (entorno linux), sigue repitiendo el mismo
error, no me deja ingresar la data... realmente extraño...

Alguna idea de porque puede suceder esto ?


Ismael Camarero escribió:
> Pues sigo insistiendo, la solucion es fflush(stdin). Y es lógico ya que 
> fgets permite tomar 20 pulsaciones del teclado. Si pulsamos mas de 20 
> numeros, lo permite, aunque no lo guarde... pero aunque no los guarde... 
> quedan en el buffer de teclado. El primer dígito del buffer se asocia dentro 
> del while con el case correspondiente (que  sino es 1 ó 2, va al default y 
> genera el mensaje de error.
> Por tanto para evitarlo es necesario fflush, adecuadamente colocado:
> 
> Adjunto un fragmento de tu código fuente:
> 
> 
> fflush(stdin);
> while (a!=4){
>         switch(a)
>             {
>             case 1: cad2int();
>             break;
>             case 2: scanf("%d%", &entero);
>             //int2cad(entero);
>             break;
>             default: printf("\nINGRESO ERRONEO");
>             }
>             printf("\n\nElija opcion");
>             printf("\n1. Cadena de char");
>             printf("\n2. Entero");
>             printf("\n4. Salir\n.");
>             fflush(stdin);                   //AQUI!!!!
>             scanf("%d",&a);
> 
>             }
> getch();
> }
> void cad2int()
> {
> char cad[TAM],numero[TAM];
> int x=0, y;
> printf("Ingrese cadena: ");
> fflush(stdin);                        //AQUI!!!
> fgets(cad, TAM, stdin);
> for (y=0;y<TAM;y++)
>      { if(cad[y]>='1' && cad[y]<='9')
>          {numero[x]=cad[y]; x++; }
>      }
> 
> 
> El resto del código igual que el que tu enviaste.
> En Dev-C++ funciona correctamente.
> 
> Sin embargo, en la validación de caracteres en vez del
> 
>     if(cad[y]>='1' && cad[y]<='9')    //no admite el cero?
> 
> yo emplearía la función de validación isdigit()
> 
> Un saludo
> 
> Ismael
> 
> 
>> Ismael Camarero escribió:
>>> LA solución más probable creo que es:
>>>
>>>
>>> char cad[TAM],numero[TAM];
>>> int x=0, y;
>>> printf("Ingrese cadena: ");
>>>
>>> fflush(stdin) ;     //AQUI: Limpia \n que permanece en buffer de teclado
>>> desde scanf();
>>>
>>> fgets(cad, TAM, stdin);
>>> for (y=0;y<TAM;y++)
>>>
>> Gracias Ismael por la idea.... pero ya lo he hecho y me hace lo mismo...
>>   :-(
>>
>>>
>>> Ismael
>>>
>>>
>>>
>>>> From: Omar Murray <esomy_m en yahoo.es>
>>>> Reply-To: Lista de correo sobre C y C++ <cconclase en listas.conclase.net>
>>>> To: C-con-Clase <cconclase en listas.conclase.net>
>>>> Subject: [C con Clase] Problemas con "Switch"
>>>> Date: Mon, 30 Apr 2007 18:50:23 -0300
>>>>
>>>> Hola lista:
>>>>
>>>> Les paso esta parte de código:
>>>>
>>>> [...]
>>>> scanf("%d",&a);
>>>>
>>>> while (a!=4){
>>>>     switch(a)
>>>>             {
>>>>             case 1: cad2int();
>>>>             break;
>>>>
>>>> [...]
>>>>
>>>> //****************************FUNCION CADENA A
>>>> ENTERO********************************
>>>> void cad2int()
>>>> {
>>>> char cad[TAM],numero[TAM];
>>>> int x=0, y;
>>>> printf("Ingrese cadena: ");
>>>> fgets(cad, TAM, stdin);
>>>> for (y=0;y<TAM;y++)
>>>>      { if(cad[y]>='1' && cad[y]<='9')
>>>>          {numero[x]=cad[y]; x++; }
>>>>      }
>>>> numero[x]='\0';
>>>> printf("\nEl numero de DNI: \"%s\" es ahora el entero: %d\n", numero,
>>>> atol(numero));
>>>> }
>>>>
>>>> Cuando eligo con el "switch" la opción '1' no me permite, cuando pasa a 
>> la
>>>> función, ingresar el valor de la variable "cad" con la función fgets.
>>>> Calculo que debe ser un error mio en el switch, porque esta función si 
>> la
>>>> compilo separadamente me funciona sin problemas....
>>>>
>>>> No puedo encontrar el error, alguien me podría dar una pista...?
>>>>
>>>> Gracias y saludos.
>>>>


-- 
oM

Omar G. Murray [Crux_]
esomy_m en yahoo.es
JID: Crux en jabber.freenet.de
http://mysteriouswaystg.blogspot.com
*********************************************
Powered by Debian Etch GNU-Linux - kernel 2.6.17-2-K7
&&
Powereb by Ubuntu Feisty Fawn 7.04 GNU-Linux - kernel 2.6.20-15




Más información sobre la lista de distribución Cconclase