C中的切换功能可以完成所有情况

时间:2013-10-02 19:51:43

标签: c switch-statement

好的,所以我正在为某些东西编写代码,我在测试切换功能时遇到了问题。它完成了从一个人的选择中增加的所有情况(我的解释)。有人可以帮我解释一下为什么会这样吗?

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

6 个答案:

答案 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;
}