-1

这段代码有什么问题:

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 的值如何,它总是打印“九”。我究竟做错了什么??

4

4 回答 4

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

您可以在此处或任何有关 C 语言的书中找到记录的 switch 语句。

于 2013-08-14T18:13:40.980 回答
4

您需要在每个案例后休息。

case 0: 

do soemthing;

 break;

case 1:

 do something;

 break;

在许多托管语言中,它不会让“一个案例落入另一个案例”并引发错误。但是C喜欢让你为所欲为!

于 2013-08-14T18:13:05.130 回答
1

你错过了break;每个案例

Example :
 case 0:   strcpy(resultString, "Zero");break;
 ..
 ..
 case 8: .... ; break;
 ..
于 2013-08-14T18:14:20.893 回答
1

从标准:

6.4.2 switch 语句[stmt.switch]

case 和 default 标签本身不会改变控制流,控制流在这些标签上继续畅通无阻。要退出 a switch,请参见break(6.6.1)。

6.6.1 中断语句 [stmt.break]

break语句应仅出现在迭代语句或switch语句中,并导致最小的封闭迭代语句或 switch 语句终止;控制传递到终止语句之后的语句(如果有)。

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

你应该这样做:

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

    default:
        // ...
}
于 2013-08-14T18:19:03.643 回答