gpt4 book ai didi

c - 写一个C结构

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:06 25 4
gpt4 key购买 nike

有没有一种方法(在 C 中)可以编写类似于 switch 语句的构造,但用于字符串?有没有一种方法可以完全用 C 编写 C 构造?

我所说的 C 构造是指带大括号的语句...就像 if 语句有大括号,它是 C 构造...对吧?

最佳答案

最简单的方法是使用 strcmp 的 if-else 链来进行比较:

if (strcmp(str, "String 1") == 0)
// do something
else if (strcmp(str, "String 2") == 0)
// do something else
else if (strcmp(str, "String 3") == 0)
// do something else
...
else
printf("%s not found\n", str);

更复杂的方法是使用查找表,以字符串为键:

struct lookup {const char *key; int value};

struct lookup LookupTable[] = {
{"String 1", 1},
{"String 2", 2},
{"String 3", 3},
...
{NULL, -1}
};

int lookup(const char *key)
{
size_t i = 0;
while (LookupTable[i].key != NULL)
if (strcmp(str, LookupTable[i].key) == 0)
return LookupTable[i].value;
else
i++;
return -1;
}
...
switch(lookup(str))
{
case 1: ...
case 2: ...
case 3: ...
...
default: printf("%s not found\n", str); break;
}

如果你真的想变得很花哨,你可以修改查找表,使值是一个指向函数的指针:

void String1Cmd(void) { ... }
void String2Cmd(void) { ... }
void String3Cmd(void) { ... }
...
void BadCmd(void) { printf("Key not found!\n"); }

struct lookup {char *key, void (*cmd)(void); };

struct lookup LookupTable[] = {
{"String 1", String1Cmd},
{"String 2", String2Cmd},
{"String 3", String3Cmd},
...
{NULL, BadCmd}
};

void (*lookup(const char *str))(void)
{
size_t i = 0;
while(LookupTable[i].key != NULL)
if (strcmp(str, LookupTable[i].key) == 0)
return LookupTable[i].cmd;
else
i++;
return BadCmd;
}
...
void (*f)(void) = lookup(str); // retrieve the function for the given string
f(); // execute the function

在上一个例子中,如果 str == "String 1",那么 String1Cmd 将被执行。如果 str 是在查找表中找不到的字符串,则将执行 BadCmd。这种方法非常灵活,并且根据您的设计,允许您在运行时添加行为(某种插件架构)。

但是,请注意,我们只是将主要问题 - 对字符串值的分支 - 推迟到 lookup 函数,并且 lookup 函数又回到了对表中的每个值执行 strcmp。我们可以通过使用 hash table 来加快这部分过程。或 tree以尽量减少比较次数。根据您分支的字符串数量,这可能值得也可能不值得付出额外的努力。

关于c - 写一个C结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com