2

ゲームに取り組んでいて、コードを実行すると、「ケースラベルが整数定数に減少しません」というエラーが発生しました。これが何を意味するのかはわかっていると思いますが、どうすれば修正できますか?これが私のコードです:

#include<stdio.h>
#include<stdlib.h

int player_cash[3] = {50};
char job[][20] {
    'A',
    'B',
    'C',
    "Donate",
    "Go to work",
    "Exit"
};
int jobs;

int main()
{
    while(player_cash[0] > 0) {
        printf("Please type A, B, C, Donate, Go to work, or Exit\n");
        switch(jobs) {

            case 'A':
            player_cash[0]-=5;
            player_cash[1]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;

            case 'B':
            player_cash[0]-=5;
            player_cash[2]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;

            case 'C':
            player_cash[0]-=5;
            player_cash[3]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;

            case "Donate":
            player_cash[0]-=15; //Error here
            player_cash[1]+=5;
            player_cash[2]+=5;
            player_cash[3]+=5;
            printf("Cash donated\n\n");
            printf("Cash=%i\n\n", player_cash[0]);
            continue;

            case "Go to work":
            player_cash[0]+=10; //Error here
            printf("Work done\n\n");
            printf("Cash=%i\n\n", player_cash[0]);
            continue;

            case "Exit":
            printf("Thanks for playing!\n\n"); //Error here
            break;

            default:
            printf("Does not compute");
            continue;
        }
    }
        getchar();
        return 0;
}

したがって、ユーザーに実行してもらいたいのは、オプションの1つを入力し、それに対応するアクションを実行することです。これを修正するにはどうすればよいですか?

4

4 に答える 4

7

case文字列を式として使用することはできません。

case "Donate":

使用できるのは積分式のみなので、例えばcase 'A':OKです。

概念的には問題があります:jobsは、intであり、文字列をテストしています。ユーザーが文字列(複数の文字)を入力できるようにする場合は、文字列変数を保持し、次のようなものを使用してfgets入力の全行を取得する必要があります。

于 2012-10-13T17:05:50.677 に答える
1

ケースラベルの一部は文字です(タイプchar、sで示されます')。それら整数定数です。

"他のラベルは、有効なタイプの。を持つ文字列リテラル(で示される)ですconst char *1これら整数定数ではないため、このように使用することはできません。


1歴史的な理由から、それらはあたかもそれらがそうであるかのように使用されることがよくありますがchar *、それらを変更しようとしないでください。またはそうでなければ。

于 2012-10-13T17:07:49.117 に答える
1

文字列をcと比較することはできません。"hello" == "hello"意図したとおりに機能しません。スイッチは、基本タイプの単純なc比較のみを実行します。

switch(jobs) {

        case 'A':
        player_cash[0]-=5;
        player_cash[1]+=5;
        printf("Cash=%i\n\n", player_cash[0]);
        continue;

        case 'B':
        player_cash[0]-=5;
        player_cash[2]+=5;
        printf("Cash=%i\n\n", player_cash[0]);
        continue;

        case 'C':
        player_cash[0]-=5;
        player_cash[3]+=5;
        printf("Cash=%i\n\n", player_cash[0]);
        continue;

        case 'D':
        player_cash[0]-=15; //Error here
        player_cash[1]+=5;
        player_cash[2]+=5;
        player_cash[3]+=5;
        printf("Cash donated\n\n");
        printf("Cash=%i\n\n", player_cash[0]);
        continue;

        case 'G':
        player_cash[0]+=10; //Error here
        printf("Work done\n\n");
        printf("Cash=%i\n\n", player_cash[0]);
        continue;

        case 'E':
        printf("Thanks for playing!\n\n"); //Error here
        break;

        default:
        printf("Does not compute");
        continue;
    }

で文字を読み取るだけなのでgetch()、この値を比較できます。(ただし、ユーザーに「Donate」と入力したため、1文字だけ入力するように依頼します。getch()は最初にDを読み取り、次に戻り、次にoを読み取ります。)

于 2012-10-13T17:08:42.740 に答える
1
  1. ジョブ配列に一貫性のない初期化子がありました(混合charおよびconst char *

  2. 文字ポインタはコンパイル時定数ではないため、文字列リテラルを大文字小文字のラベルとして使用することはできません。整数を使用します:

    enum jobType
    {
        jobA,
        jobB,
        jobC,
        jobDonate,
        jobGoToWork,
        jobExit,
        /* marker */
        jobInvalid
    };
    
    enum jobType typeOfJob(const char* const name)
    {
        int i;
        for (i=jobA; i!=jobInvalid; ++i)
            if (0 == strcmp(jobNames[i], name))
                return i;
        return i;
    }
    
  3. また、player_cashは1要素不足でした(インデックス[3]で範囲外に書き込まれました)


コードサンプルは、一般的なgets悪さを回避し、基本的な行末のトリミングを行い、ケースに依存しない比較を行う方法も示しています(stricmpWindows、IIRC):http: //liveworkspace.org/code/227015a4e51126d55ca4eb1eea739b02

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int player_cash[4] = {50};

enum jobType
{
    jobA,
    jobB,
    jobC,
    jobDonate,
    jobGoToWork,
    jobExit,
    /* marker */
    jobInvalid
};

const char jobNames[][20] =
{
    "A",
    "B",
    "C",
    "Donate",
    "Go to work",
    "Exit"
};

enum jobType typeOfJob(const char* const name)
{
    int i;
    for (i=jobA; i!=jobInvalid; ++i)
#ifdef CASE_SENSITIVE
        if (0 == strcmp(jobNames[i], name))
#else
        if (0 == strcasecmp(jobNames[i], name))
#endif
            return i;
    return i;
}

const char* safer_gets()
{
    static char input[1024];
    char *p;
    const char* t;
    const char trimAt[] = "\r\n\t ";
    fgets(input, sizeof(input), stdin);

    for (t=trimAt; *t; ++t)
        while(p = strrchr(input, *t)) 
            *p = 0;

    return input;
}

int main()
{
    const char* input;
    while(player_cash[0] > 0)
    {
        printf("Please type A, B, C, Donate, Go to work, or Exit\n");
        input = safer_gets();

        switch(typeOfJob(input))
        {
        case jobA:
            player_cash[0]-=5;
            player_cash[1]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;
        case jobB:
            player_cash[0]-=5;
            player_cash[2]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;
        case jobC:
            player_cash[0]-=5;
            player_cash[3]+=5;
            printf("Cash=%i\n\n", player_cash[0]);
            continue;
        case jobDonate:
            player_cash[0]-=15; 
            player_cash[1]+=5;
            player_cash[2]+=5;
            player_cash[3]+=5;
            printf("Cash donated\n\n");
            printf("Cash=%i\n\n", player_cash[0]);
            continue;
        case jobGoToWork:
            player_cash[0]+=10;
            printf("Work done\n\n");
            printf("Cash=%i\n\n", player_cash[0]);
            continue;
        case jobExit:
            printf("Thanks for playing!\n\n");
            break;
        default:
            printf("Does not compute");
            continue;
        }
    }
    getchar();
    return 0;
}
于 2012-10-13T19:24:10.930 に答える