通常我需要根据非POD常量元素的值选择要做的事情,如下所示:
switch( str ) {
case "foo": ...
case "bar": ...
default: ...
}
Run Code Online (Sandbox Code Playgroud)
可悲的是switch只能用整数:error: switch quantity not an integer.
实现这样的事情最简单的方法是获得一系列ifs:
if( str == "foo" ) ...
else if( str == "bar" ) ...
else ...
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案看起来很脏并且应该花费O(n),其中n是案例数,而在最坏的情况下,使用二进制搜索,这段代码可能花费O(log n).
使用一些数据结构(如Maps)可以获得表示字符串的整数(O(log n)),然后使用O(1)switch,或者可以通过if在右边嵌套s 来实现静态二进制排序但是,这些黑客攻击还需要大量编码,使一切变得更加复杂和难以维护.
最好的方法是什么?(快速,干净,简单,正如switch声明所述)
不知何故,我的switch语句没有通过我的任何案例,但它不应该进入一个?(我使用/sf/answers/281048701/作为参考).
没有输出,应用程序被阻止后.
#include <stdio.h>
#include <stdlib.h>
#define BADKEY -1
#define string1 1
#define string2 2
#define string3 3
#define string4 4
char *x = "string1";
typedef struct {char *key; int val; } t_symstruct;
static t_symstruct lookuptable[] = {
{ "string1", string1 }, { "string2", string2 }, { "string3", string3 }, { "string4", string4 }
};
#define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))
int keyfromstring(char *key) {
int i;
for (i=0; i < NKEYS; i++) {
t_symstruct *sym = lookuptable + i;
printf("before: …Run Code Online (Sandbox Code Playgroud)