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

ルールは簡単です。switch/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;   
}
于 2013-10-02T19:52:51.873 に答える
2

各ケースの最後にa を追加しないbreakと、次のケースに失敗します。

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

caseステートメント内のAはswitch、ラベルのように扱われます (C.11 § 6.8.1 を参照)。. 実際には、 s を持つ必要はまったくありませんcase(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。statement がないbreak場合、 の最後のステートメントcaseが実行されると、制御は次の の最初のステートメントに「フォールスルー」しますcase。次の case ラベル (const-expression)caseは無視されます。break(またはいくつかの jump ステートメント) がなければ、制御は次からcase次へと流れます。

于 2013-10-02T20:01:03.677 に答える