【问题标题】:Switch function in C does all the casesC 中的 switch 函数适用于所有情况
【发布时间】:2013-10-02 19:51:42
【问题描述】:

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

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

【问题讨论】:

    标签: c switch-statement


    【解决方案1】:

    您忘记在每个case 之后添加break; 语句。

    case 2:
        stats(fajl);
        break; /* <---- */
    

    【讨论】:

      【解决方案2】:

      您应该在每个case 之后放置一个break;

      switch/case 规则很简单,在一个匹配的 case 之后,后面的所有 case 都会执行到 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;   
      }
      

      【讨论】:

      • 哦,那是因为我没有倒带文件:P 傻我。
      【解决方案3】:

      如果您不在每个案例的末尾添加break,它将直接进入下一个案例:

      switch (selection)
      {
          case 1:
              ratedz(fajl);
              break ;
          case 2:
              stats(fajl);
              break ;
           /* ... */
       }
      

      【讨论】:

        【解决方案4】:

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

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

        上面的代码可以正常编译。

        由于case 就像一个标签,它没有附加任何隐式语义会导致它自动跳出switch。正如break 用于提前离开循环块一样,break 也用于提前离开switch 块。

        【讨论】:

          【解决方案5】:

          C 中switch 语句的语法

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

          要处理特定情况,您在该组语句中的最后一条语句必须是 break。 在没有break 语句的情况下,当case 中的最后一条语句已执行时,控制“落入”以下case 中的第一条语句;下一个case 的大小写标签(常量表达式)被忽略。如果没有break(或一些跳转语句),控制将从一个case 流向下一个。

          【讨论】:

          • 实际上switch 的“语法”可能比这复杂得多。可以有任何语句或块作为依赖语句,case 只是该依赖语句中的标签。您所描述的只是switch 的一个(非常常见的)用例。
          【解决方案6】:

          一些更正,

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-14
            • 2012-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-23
            相关资源
            最近更新 更多