Самый простой подход - это цепочка if-else, использующая strcmp
для сравнения:
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
== "Строка 1", будет выполняться String1Cmd
. Если str
- строка, не найденная в таблице поиска, то будет выполняться BadCmd
. Этот метод очень гибкий и в зависимости от вашего дизайна позволяет добавлять поведение во время выполнения (своего рода архитектура подключаемого модуля).
Однако обратите внимание, что мы только что перенесли основную проблему - ветвление на строковое значение - на функцию lookup
, и что функция lookup
вернулась к выполнению strcmp
для каждого значения в таблице , Мы могли бы ускорить эту часть процесса, используя хеш-таблицу или дерево , чтобы минимизировать количество сравнений. В зависимости от того, сколько строк вы используете, это может стоить или не стоить дополнительных усилий.