Мы не можем уйти от лестницы if-else, чтобы сравнить строку с другими. Даже обычный switch-case также является внутренним лестницей if-else (для целых чисел). Мы могли бы только смоделировать случай переключения для строки, но никогда не сможем заменить лестницу if-else. Лучшие из алгоритмов сравнения строк не могут избежать использования функции strcmp. Означает сравнивать символ за символом, пока не будет найдено совпадение. Поэтому использование if-else ladder и strcmp неизбежно.
DEMO
А вот простейшие макросы для имитации переключателя для строк.
#ifndef SWITCH_CASE_INIT
#define SWITCH_CASE_INIT
#define SWITCH(X) for (char* __switch_p__ = X, int __switch_next__=1 ; __switch_p__ ; __switch_p__=0, __switch_next__=1) { {
#define CASE(X) } if (!__switch_next__ || !(__switch_next__ = strcmp(__switch_p__, X))) {
#define DEFAULT } {
#define END }}
#endif
И вы можете использовать их как
char* str = "def";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def") // Notice: 'break;' statement missing so the control rolls through subsequent CASE's until DEFAULT
printf("in def\n");
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
Выход:
in def
in ghi
in DEFAULT
Ниже показано использование вложенного переключателя:
char* str = "def";
char* str1 = "xyz";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
SWITCH (str1) // <== Notice: Nested SWITCH
CASE ("uvw")
printf("in def => uvw\n");
break;
CASE ("xyz")
printf("in def => xyz\n");
break;
DEFAULT
printf("in def => DEFAULT\n");
END
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
Выход:
in def
in def => xyz
in ghi
in DEFAULT
Вот SWITCH обратной строки, где вы можете использовать переменную (а не константу) в предложении CASE:
char* str2 = "def";
char* str3 = "ghi";
SWITCH ("ghi") // <== Notice: Use of variables and reverse string SWITCH.
CASE (str1)
printf ("in str1\n");
break;
CASE (str2)
printf ("in str2\n");
break;
CASE (str3)
printf ("in str3\n");
break;
DEFAULT
printf("in DEFAULT\n");
END
Вывод:
in str3