此代码有什么问题:
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”。我做错了什么?
答案 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:
// ...
}