Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Samnov en 26 Noviembre 2010, 21:57 pm



Título: Problema con el Switch en C
Publicado por: Samnov en 26 Noviembre 2010, 21:57 pm
Os cuento la situación para situaros , solo me dejan usar la stdio.h , por lo tanto cualquier cosa o ocurrencia para solucionar el problema que no se resuelva con esa libreria no me valdra

El tema es es siguente yo hago un switch dentro de un do//while para que se vaya repitiendo todo va perfecto , funciona , tiene los cases bien puestos el default por si acaso introduce el numero incorrecto etc etc , pero justo en el numero esta mi problema, me explico si por casualidad al usuario se le pasa por la cabeza poner una 'a' pues se fastidio el programa porque empieza a hacer un bucle infinito no se como solucionarlo :s

es algo asi por si no lo veis

scanf("%d", &cosa);
do{
switch(cosa)
     case 1:
     break
     .

     . 

     .
     default printf("opcion incorrecta!);

}while(cosa != 6)


Título: Re: Problema con el Switch en C
Publicado por: xassiz~ en 26 Noviembre 2010, 22:13 pm
Simplemente haz un break:

Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.    int cosa;
  6.  
  7.    scanf("%i", &cosa);
  8.  
  9.    switch(cosa)
  10.    {
  11.        case 1:
  12.            //Primera opcion
  13.        case 2:
  14.            //Segunda opcion
  15.        default:
  16.            //Lo que ocurre si no se eligieron las anteriores
  17.            break;
  18.     }
  19.  
  20.     return 0;
  21. }
  22.  


Título: Re: Problema con el Switch en C
Publicado por: Samnov en 26 Noviembre 2010, 22:22 pm
Gracias, pero no no funciona tampoco lo del break :S, no se que hacer la verdad


Título: Re: Problema con el Switch en C
Publicado por: Beakman en 26 Noviembre 2010, 22:35 pm
podes poner el codigo completo?


Título: Re: Problema con el Switch en C
Publicado por: Samnov en 26 Noviembre 2010, 22:46 pm
mmm.. bueno es que es basicamente lo que he puesto xD no se pero bueno si venga pongo un ejemplo tal y como es el mio

#include <stdio.h>

int main()
{
//menu con tres casos
int opcion;


do{

    printf("Introduzca la opcion que desea \n");
    scanf("%d", &opcion);

    switch(opcion)
  
    case 1: printf("hola");
    break;

    case 2: printf("adios");
    break;

    case 3:
    break; //para salir

default:
printf("Opcion incorrecta");
break;

}while(opcion != 3);

}

lo que he hecho ahora es una tonteria pero es en escencia lo que tengo , el problema viene cuando en vez de poner por ejemplo la opcion 2 se me ocurre poner una a, al principio pense en hacerlo con if's pero hay montones de posibilidades y en este caso no seria muy dificil pero en un menu con 15 opciones por ejemplo seria morirse

// modificado tienes razon esque lo copie mal perdon


Título: Re: Problema con el Switch en C
Publicado por: xassiz~ en 26 Noviembre 2010, 22:47 pm
¿No ves que la variable opcion siempre va tener el mismo valor dentro del bucle? La entrada de datos está fuera. :rolleyes:


Título: Re: Problema con el Switch en C
Publicado por: Beakman en 26 Noviembre 2010, 23:15 pm
Si el problema es que el usuario ingrese una letra, es logico que va a saltar un error porque la variable opcion es un int.
Intenta cambiarlo por un char. Y en vez de poner case 1, case 2, le pones case '1', case '2'.
Ah y te faltan las llaves { } para el switch.


Título: Re: Problema con el Switch en C
Publicado por: Samnov en 26 Noviembre 2010, 23:24 pm
GUAU!! muchas gracias asi si que funciona , bueno saltan unos warnings al compilar que dicen algo de multi-character constant pero si el programa funciona

Lh: No hagas doble post. Utiliza el botón modificar.

Pero ahora la duda que tengo es porque me sale lo del multi-character constant en el momento de compilar con el gcc, esque claro preferiria que compilara limpio sabeis sin warnings de por medio, aunque le doy las gracias a qily y pablomi ;D por solucionar el problema


Título: Re: Problema con el Switch en C
Publicado por: Beakman en 28 Noviembre 2010, 04:22 am
Eso salta cuando haces algo asi por ejemplo:
Código
  1. switch( op )
  2. {
  3.   case 'aa': break;
  4. }
  5.  


Título: Re: Problema con el Switch en C
Publicado por: Samnov en 5 Diciembre 2010, 21:10 pm
y sabes si hay alguna forma de resolverlo ? es decir yo hago exactamente lo que dices y vale si el programa tira bien pero el problema viene porque la compilación no es digamosle "limpia", si hay alguna forma que alguien sepa para solucionar lo del dichoso multi-character constat le estaria agradecido


Título: Re: Problema con el Switch en C
Publicado por: JuszR en 5 Diciembre 2010, 22:18 pm
O estás poniendo más de un caracter (como ya dijeron) o es un caracter acentuado o por el estilo.

Esto también daría warnings:
Código
  1. case '&#193;':
  2. case '&#195;:

Y si pones más de un caracter, nunca vas a llegar a esa parte del case porque char solo almacena un caracter.



Título: Re: Problema con el Switch en C
Publicado por: winroot en 5 Diciembre 2010, 23:55 pm
Buenas!
Porqué solo stdio?
Es decir,¿ no podés usar funciones del estilo atoi o itoa?.
si no me equivoco definidas en stdlib.h, una librería estándar.
Lo que haría yo es:
.Guardar la entrada en una cadena.
.Comprovar que es un número válido.
.Usar la función atoi para pasar de char* a int.
.Usar enumeraciones para el switch.
En c++ con boost todo es mas simple ^^.
Saludos


Título: Re: Problema con el Switch en C
Publicado por: BlackZeroX en 6 Diciembre 2010, 08:48 am
.
Espero te sirva alguno de estos ejemplos con Switch y otro con if, no me gusta mucho usar otras librerias si no nesesito muchas de ellas, por ende me creo algunas como el el segundo ejemplo, donde me ahorre String.h.

Código
  1.  
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    int opcion;
  9.    do {
  10.        cout << "Introduzca la opcion que desea"<<endl;
  11.        cin >> opcion;
  12.        switch(opcion)
  13.        {
  14.            case 1:
  15.                cout << "hola" << endl;break;
  16.            case 2:
  17.                cout << "Adios" << endl;break;
  18.            case 3:break;
  19.            default:
  20.                cout<<"Opcion incorrecta" << endl;break;
  21.        }
  22.    }while(opcion != 3);
  23.    return (1);
  24. }
  25.  
  26.  

Código
  1.  
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. //  By BlackZeroX.
  7. int strcmp( char *s , char *t );
  8. int strcmp( char *s , char t[] );
  9. int strcmp( char s[] , char *t );
  10. int strcmp( char s[] , char t[] );
  11. // http://infrangelux.sytes.net/
  12.  
  13. int main()
  14. {
  15.    char char_opt[250];
  16.    for(;;)
  17.    {
  18.        cout << "Introduzca la opcion que desea"<<endl;
  19.        cin >> char_opt;
  20.        if (        strcmp(&char_opt[0],"hi") == 0 ) {
  21.            cout << "hola" << endl;
  22.        } else if ( strcmp(&char_opt[0],"xao") == 0 ) {
  23.            cout << "Adios" << endl;
  24.        } else if ( strcmp(&char_opt[0],"exit") == 0 ){
  25.            break;  //  Sale del siclo For()
  26.        } else {
  27.            cout<<"Opcion incorrecta" << endl;
  28.        }
  29.    }
  30.    return (1);
  31. }
  32.  
  33. int strcmp( char *s , char *t ) //  By BlackZeroX ( http://infrangelux.sytes.net/ ).
  34. { /* Devuelve <0 si s<t, 0 si s==t, >0 si S>t */
  35.    for(;*s==*t;s++,t++)
  36.        if (*s == '\0')
  37.            return (0);
  38.    return (*s - *t);
  39. }
  40.  
  41.  

Sangriento Infierno Lunar!¡.


Título: Re: Problema con el Switch en C
Publicado por: winroot en 6 Diciembre 2010, 15:05 pm
Buenas!
Lo de boost lo puse porque se puede comprovar si un número es válido tomando un string.
Por cierto, si vas a usar c++, usa la clase string, que es mucho mas segura que las cadenas clásicas de c.
Además, sigue pasando lo mismo, es mas, si el usuario introduce por ejemplo 1000000000000fffff, probablemente el programa ´dejará de funcionar ^^.
Código
  1. int num=0;
  2. cin >>num;
  3. if(false ==cin)
  4. {
  5. cout <<"Error leyendo entrada " <<endl;
  6. return 1;
  7. }
  8.  
  9.  
En c, si no me equivoco existe una macro llamada isdigit, que comprueva si el char que se le pasa es un número válido .
Saludos