切换声明不按我的意料行事

时间:2013-08-14 18:12:35

标签: c

此代码有什么问题:

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);

无论n的值如何,它总是打印“Nine”。我做错了什么?

4 个答案:

答案 0 :(得分:13)

每个案例结尾都需要一个break语句。否则控制将直接进入下一个案例。

将您的代码更改为:

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);

您可以找到记录here的switch语句或C语言的任何书籍。

答案 1 :(得分:4)

每个案例都需要打破。

case 0: 

do soemthing;

 break;

case 1:

 do something;

 break;

在许多托管语言中,它不会让“一个案例落入另一个案例”,并抛出错误。但C喜欢让你做任何你想做的事情!

答案 2 :(得分:1)

每个案例后你错过了break;

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

答案 3 :(得分:1)

来自标准:

  

6.4.2 switch语句[stmt.switch]

     

大小写和默认标签本身并不会改变控件的流量,而这些标签在这些标签上继续畅通无阻。 要退出switch,请参阅break(6.6.1)。

     

6.6.1中断声明[stmt.break]

     

break语句只能在迭代语句或switch语句中出现,并导致终止最小的封闭迭代语句或switch语句;控制权传递给终止语句后的语句,如果有的话。

这意味着您在每个break之后不使用case,您的程序将输入匹配条件的第一个case,并将继续执行switch的每一行{1}}直到结束。

你应该做的事情如下:

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

    default:
        // ...
}