0

スイッチケースについて簡単な質問があります。私はこれを行うことができますか?私はそれを働かせることができません。終了と入力すると、プログラムは無効と3回言います。疑似コードを許してください。おっと、その部分の前にprintf関数がこのように見えることを忘れていました。

char choice;
printf("list, add, delete, write, quit\n");

do
{
scanf("%c", &choice);
//if (&choice== "quit"){exit(1);}

switch(choice)
    {
        case "list":
        case "add":
        case "delete":
        case "write":
        default:
            printf("Invalid\n");
            break;
        case "quit":
        exit (1);

    }while(&choice !="quit");

}

4

4 に答える 4

4

そのような文字列を比較することはできません。文字列の比較は、strcmpとその親族で行う必要があります。この場合、文字列のアドレスを比較しています。

于 2012-06-03T18:26:37.240 に答える
2

文字列を好きなように直接比較することはできませんが、辞書と定義/列挙を使用してスイッチを使用できる方法があります (私がそこで行ったことを参照してください)。

enum choices { LIST, ADD, DELETE, WRITE, QUIT, INVALID };

int
getchoice(char *input)
{
    static struct choices {
        enum choices val;
        const char *string;
    } choices [] = {
        { LIST, "list" },
        { ADD, "add" },
        { DELETE, "delete" },
        { WRITE, "write" },
        { QUIT, "quit" },
        { -1, NULL }
    };
    int i;

    for (i = 0; choices[i].val != -1; i++)
        if (strcmp(input, choices[i].string) == 0)
            break;
    if (choices[i].val == -1)
        return INVALID;
    return (choices[i].val);
}

次に、switch ステートメントの場合:

switch (getchoice(choice)) {
case LIST:
case ADD:
case WRITE:
case DELETE:
case INVALID:
default:
    printf("Invalid\n");
    break;
case QUIT:
    exit(1);
}

これはコンパイラを介して実行されていないため、注意してください。ただし、一般的な考え方は、特定のケースに適応するのに十分明確である必要があります。

于 2012-06-03T19:56:04.180 に答える
1

breakまた、大文字小文字以外を使用しないためdefault、デフォルトの大文字小文字に自動的に「ドロップ」されます (入力choiceが「リスト」、「追加」、「削除」、「書き込み」に一致した場合でも)。

于 2012-06-03T18:29:10.860 に答える
0

あなたの質問に答えるには:

はい、exit()switch-case ステートメント内を含め、どこでも呼び出すことができます。

しかし、そのコードには多くの問題があります。質問自体で私のコメントを参照してください。

于 2012-06-03T19:13:40.200 に答える