A ver... cuando tu pones:
switch(valor)
{
case 0:
acccion0( );
break;
case 1:
accion1( );
break;
case2:
accion2( );
break;
}
el compilador lo traduce a algo parecido a:
if ( valor == 0 )
accion0( );
else if ( valor == 1 )
accion1( );
else if ( valor == 2 )
accion2( );
Obviamente la opción del switch es más limpia... por eso se usa. Por tanto, switch es exactamente igual de óptimo que if-elseif ... el compilador no hace milagros y el flujo del programa tendrá que comparar la variable con todos los valores para saber por qué opción ha de entrar. Si puedes conseguir que el switch sea más óptimo si pones las opciones más posibles al principio... así el código se ahorra comprobaciones de más.
Si quieres que el código sea más rápido puedes evitar el switch creándote un array de punteros a funciones... de tal forma que el puntero de la posición 0 apunte al código que se ha de ejecutar en el case 0, en la posición 1 el código del case 1 y así... es más rápido pero el código es algo menos legible.
Si necesito que me pasen una opcion por parametro tengo que resolverlo asi y punto.
No te pongas gallito o te buscas la solución en otra parte... es un consejo. Entre otras cosas un problema se puede solucionar de muchas formas diferentes... es por eso que la programación es más un arte que algo mecánico.
Para empezar, como te he dicho en mi primer mensaje, lo más lógico es que tu en tu aplicación tengas un menú tal que:
printf( "1. Hacer una cosa\n" ); printf( "3. Mostrar algo\n" ); printf( "Introduce una opción: \n" );
Con esto el usuario no va a introducir "opcion1" ... introducirá simplemente un "1", luego tú lo que necesitas hacer es utilizar ese "1" ... así que deja de inventarte lo de "opcion1". En primer lugar porque el usuario no lo va a introducir así... y segundo porque
ESO NO ES UN NÚMERO y la instruccion strToInt no va a hacer milagros.
Y para terminar te lo repito, los case no admiten variables, tienes que pasarle un valor fijo:
switch ( valor )
{
case 1: // 1... no una variable ni una cadena ni una funcion, un valor fijo.
...
case 2: // Otro valor fijo... nada mas
...
}
Ah bueno sí, si defines constantes también las puedes usar en un case... al fin y al cabo se acaban traduciendo en valores fijos:
#define UNO 1
#define DOS 2
switch ( valor )
{
case UNO:
...
case DOS:
...
}