为了将字符串与其他字符串进行比较,我们无法逃脱if-else阶梯。甚至常规的开关盒在内部也是if-else阶梯(对于整数)。我们可能只想模拟字符串的开关盒,但永远不能替换if-else阶梯。最好的字符串比较算法不能逃脱使用strcmp函数。表示逐字符比较直到找到不匹配的方法。因此,不可避免地要使用if-else阶梯和strcmp。
演示
这里是最简单的宏,用于模拟字符串的切换情况。
#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")
printf("in def\n");
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
输出:
in def
in ghi
in DEFAULT
下面是嵌套的SWITCH用法:
char* str = "def";
char* str1 = "xyz";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
SWITCH (str1)
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")
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