0

次の質問の回答に基づいています: C を使用して、2 つの変数を持つ IF ステートメントをスイッチ関数に変換するにはどうすればよいですか?

文字列に ( や のように)使用するマクロを開発SWITCHしたいと考えています。CASEswitchcase

そんな感じ:

char buf[256];

SWITCH (buf) {
    CASE ("abcdef"):
        printf ("A1!\n");
        BREAK;
    CASE ("ghijkl"):
        printf ("B1!\n");
        BREAK;
    DEFAULT:
        printf ("D1!\n");
        BREAK;
}

SWITCHそしてCASEBREAKそしてDEFAULTここに何がありますか?

4

2 に答える 2

2

あなたが本当にそれを望むなら、まあ、ここにあります:

#include <string.h>
#include <stdio.h>
const char *kludge;
#define evilmacro(line) label##line
#define fakelabel(line) evilmacro(line)
#define SWITCH(str) while((kludge = (str)))
#define CASE(str) if(strcmp(kludge, str) == 0) { fakelabel(__LINE__)
#define BREAK break; /* out of while loop */ }
#define DEFAULT if(1) { fakelabel(__LINE__)
int main(int argc, char *argv[]) {
SWITCH (argv[1]) {
    CASE ("abcdef"):
        printf ("A1!\n");
        BREAK;
    CASE ("ghijkl"):
        printf ("B1!\n");
        BREAK;
    DEFAULT:
        printf ("D1!\n");
        BREAK;
}
return 0;
}

未使用のラベルを取り除くことは、読者の演習として残されています:)

編集: fwiw、私が実際に行うことは、テーブル駆動型のコードです。

于 2013-01-07T17:27:57.090 に答える
-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SWITCH(S) char *_S = S; if (0)
#define CASE(S) } else if (strcmp(_S, S) == 0) {switch(1) { case 1
#define BREAK }
#define DEFAULT } else {switch(1) { case 1

int main()
{
    char buf[256];

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);

    SWITCH (buf) {
        CASE ("abcdef"):
            printf ("B1!\n");
            BREAK;
        CASE ("ghijkl"):
            printf ("C1!\n");
            BREAK;
        DEFAULT:
            printf ("D1!\n");
            BREAK;
    }
}
于 2013-01-07T16:58:31.967 に答える