Interruptor de statement no haciendo lo que espero

Qué está mal con este código:

switch (n) { case 0: strcpy(resultString, "Zero"); case 1: strcpy(resultString, "One"); case 2: strcpy(resultString, "Two"); case 3: strcpy(resultString, "Three"); case 4: strcpy(resultString, "Four"); case 5: strcpy(resultString, "Five"); case 6: strcpy(resultString, "Six"); case 7: strcpy(resultString, "Seven"); case 8: strcpy(resultString, "Eight"); case 9: strcpy(resultString, "Nine"); } printf("%s", resultString); 

Siempre imprime “Nueve” sin importar el valor de n. ¿¿Qué estoy haciendo mal??

Necesita una statement de ruptura al final de cada caso. De lo contrario, el control cae directamente al siguiente caso.

Cambie su código a:

 switch (n) { case 0: strcpy(resultString, "Zero"); break; case 1: strcpy(resultString, "One"); break; case 2: strcpy(resultString, "Two"); break; case 3: strcpy(resultString, "Three"); break; case 4: strcpy(resultString, "Four"); break; case 5: strcpy(resultString, "Five"); break; case 6: strcpy(resultString, "Six"); break; case 7: strcpy(resultString, "Seven"); break; case 8: strcpy(resultString, "Eight"); break; case 9: strcpy(resultString, "Nine"); break; } printf("%s", resultString); 

Puede encontrar la statement de cambio documentada aquí o en cualquier libro en el lenguaje C.

Necesitas romper después de cada caso.

 case 0: do soemthing; break; case 1: do something; break; 

En muchos idiomas administrados, no permite que “un caso caiga en otro” y genera un error. Pero a C le encanta dejarte hacer lo que quieras!

Te perdiste el break; después de cada caso

 Example : case 0: strcpy(resultString, "Zero");break; .. .. case 8: .... ; break; .. 

De la norma:

6.4.2 La instrucción switch [stmt.switch]

las tags de caso y por defecto en sí mismas no alteran el fl ujo de control, que continúa sin impedimentos a través de dichas tags. Para salir de un switch , ver break (6.6.1).

6.6.1 La sentencia break [stmt.break]

La statement de break se producirá solo en una instrucción de iteración o una instrucción de switch y causa la terminación de la instrucción de iteración o instrucción de conmutación más pequeña que la contiene; el control pasa a la sentencia que sigue a la sentencia terminada, si la hay.

Eso significa que si no utiliza el break después de cada case , su progtwig ingresará en el primer case que cumpla con la condición y continuará ejecutando cada línea del switch hasta el final.

Solo debes hacer algo como:

 switch( n ) { case 0: // ... break; // <- Note the break //... default: // ... }