[C con Clase] Problemas con "Switch"

Ismael Camarero icamarero98 en hotmail.com
Mie Mayo 2 19:30:11 CEST 2007


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.
> >>
> >>
> >
>

_________________________________________________________________
Dale rienda suelta a tu tiempo libre. Mil ideas para exprimir tu ocio con 
MSN Entretenimiento. http://entretenimiento.msn.es/





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