1

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

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

6 回答 6

5

您忘记break;在每个case.

case 2:
    stats(fajl);
    break; /* <---- */
于 2013-10-02T19:52:38.813 回答
4

您应该break;在每个case.

规则很简单,在一个 maced 案例之后,switch/case以下所有案例都将执行到 abreak;或 end 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;   
}
于 2013-10-02T19:52:51.873 回答
2

如果您不在break每个案例的末尾添加 a ,它只会落入下一个案例:

switch (selection)
{
    case 1:
        ratedz(fajl);
        break ;
    case 2:
        stats(fajl);
        break ;
     /* ... */
 }
于 2013-10-02T19:54:40.973 回答
2

case语句中的Aswitch被视为标签(参见 C.11 § 6.8.1)。. 实际上根本不需要任何cases (参见 C.11 § 6.8.4)。

switch (0) { /* do nothing */ }

上面的代码将编译得很好。

因为 acase就像一个标签,所以没有附加到它的隐式语义会导致它自动跳到switch. 正如break用于提早离开循环块一样,break也用于switch提早离开块。

于 2013-10-02T20:03:22.210 回答
1

switchC 中语句的语法

switch(expression)
{
     case (constant-expression) : staements  
     ....
     case (constant-expression) : staements
     default : statements
}

要处理特定情况,您在该组语句中的最后一条语句必须是break. 如果没有该break语句,当 中的最后一条语句case已执行时,控制“落入”到下面的第一条语句case;next 的 case 标签(const-expression)case被忽略。如果没有break(或一些跳转语句),控制将从一个流向case下一个。

于 2013-10-02T20:01:03.677 回答
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;
}
于 2013-10-03T07:06:11.183 回答