问是否有一种方法可以switch在字符串上?
答不直接。有时,使用一个单独的函数将字符串映射到整数代码,然后在这些代码上进行 switch 是合适的。
#define CODE_APPLE 1 #define CODE_ORANGE 2 #define CODE_NONE 0 switch(classifyfunc(string)) { case CODE_APPLE: ... case CODE_ORANGE: ... case CODE_NONE: ... }其中classifyfunc看起来像
static struct lookuptab { char *string; int code; } tab[] = { {"apple", CODE_APPLE}, {"orange", CODE_ORANGE}, }; classifyfunc(char *string) { int i; for(i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) if(strcmp(tab[i].string, string) == 0) return tab[i].code; return CODE_NONE; }
否则,当然,你可以回退到一个传统的if/else链
if(strcmp(string, "apple") == 0) { ... } else if(strcmp(string, "orange") == 0) { ... }(一个宏,如Streq()来自问题 17.3 可以使这些比较更方便。)
参见问题 10.12、20.16、20.18 和 20.29。
参考:K&R1 Sec. 3.4 p. 55
K&R2 Sec. 3.4 p. 58
ISO Sec. 6.6.4.2
H&S Sec. 8.7 p. 248