好的,所以我正在为某些东西编写代码,我在测试切换功能时遇到了问题。它完成了从一个人的选择中增加的所有情况(我的解释)。有人可以帮我解释一下为什么会这样吗?
#include <stdio.h>
#include <stdlib.h>
#include "ratedzfunctions.h"
int main()
{
int selection, loop=1;
FILE* fajl;
//Opening the participants file
fajl=fopen("participants.txt","r+");
if (fajl==NULL)
{
printf("The file cannot be opened.\n");
}
//MENU
do
{
printf("\nMENU: \n------------\n1. RATEDZ\n\n2. STATISTICS\n\n3. EXIT\n\n==>");
scanf("%d", &selection);
switch (selection)
{
case 1:
ratedz(fajl);
case 2:
stats(fajl);
case 3:
loop=0;
}
}
while (loop==1);
fclose(fajl);
return 0;
}
//THIS IS FROM RATEDZFUNCTIONS.H
void ratedz(FILE *fajl)
{
printf("\nTEST RATEDZ");
}
void stats(FILE *fajl)
{
//Printing all participants
char *buffer=(char*) malloc(50);
while(fscanf(fajl,"%s %s %s", buffer)!=EOF)
{
printf("\n%s %s %s", buffer);
}
free(buffer);
}
答案 0 :(得分:5)
您忘记在每个break;
之后添加case
语句。
case 2:
stats(fajl);
break; /* <---- */
答案 1 :(得分:3)
您应该在每个break;
后添加case
。
switch/case
规则很简单,在mached案例之后,以下所有案例都将执行到break;
或switch
结束:
switch (selection)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break; // Last break is not necessary
// but it's good practice to put it.
}
有很好的情况,删除break;
是合理的:
switch(letter)
{
case 'i':
case 'a':
case 'o':
case 'u':
case 'e':
printf ("Vowel!");
break;
default :
printf ("Consonant!");
break;
}
答案 2 :(得分:2)
如果你在每个案例结尾处没有添加break
,那么它将直接进入下一个案例:
switch (selection)
{
case 1:
ratedz(fajl);
break ;
case 2:
stats(fajl);
break ;
/* ... */
}
答案 3 :(得分:2)
case
语句中的switch
被视为标签(参见C.11§6.8.1)。 。实际上根本不需要任何case
(参见C.11§6.8.4)。
switch (0) { /* do nothing */ }
上面的代码编译得很好。
由于case
就像一个标签,因此没有附加隐式语义会导致它自动跳到switch
之外。就像break
用于提前保留循环块一样,break
也用于提前离开switch
块。
答案 4 :(得分:1)
C中switch
语法的语法
switch(expression)
{
case (constant-expression) : staements
....
case (constant-expression) : staements
default : statements
}
要处理特定情况,您在该语句组中的最后一条语句必须为break
。
如果没有break
语句,当case
中的最后一个语句被执行时,控制“通过”到下面case
中的第一个语句;下一个case
的大小写标签(const-expression)将被忽略。如果没有break
(或某些跳转语句),控件将从一个case
流入下一个{{1}}。
答案 5 :(得分:0)
一些更正,
#include <stdio.h>
#include <stdlib.h>
#include "ratedzfunctions.h"
int main()
{
int selection, loop=1;
FILE* fajl;
//Opening the participants file
fajl=fopen("participants.txt","r+");
if (fajl==NULL)
{
printf("The file cannot be opened.\n");
exit(1); //handle error when file cannot be opened...
}
//MENU
do
{
printf("\nMENU: \n------------\n1. RATEDZ\n\n2. STATISTICS\n\n3. EXIT\n\n==>");
scanf("%d", &selection);
switch (selection)
{
case 1:
ratedz(fajl);
break;
case 2:
stats(fajl);
break;
case 3:
loop=0;
break;
default:
break;
}
}
while (loop==1)
{
//do stuff here
}
fclose(fajl);
return 0;
}