Ваша строка сравнения неверна. Они должны иметь форму "hist"
, а не 'hist'
.
В C ++ 'hist'
- это просто символьный литерал (как указано в разделе 2.14.3 стандарта C ++ 0x draft (n2914)), мой акцент на последнем абзаце:
Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как, например, в 'x', необязательно перед одной из букв u, U или L, как в u'y ', U'z' или L 'x' соответственно.
Символьный литерал, который не начинается с u, U или L, является обычным символьным литералом, также называемым литералом узкого символа.
Обычный символьный литерал, содержащий один символ c-char, имеет тип char, значение которого равно числовому значению кодировки символа c-char в наборе символов выполнения.
Обычный символьный литерал, содержащий более одного символа c-char, является литералом с несколькими символами. Литерал с несколькими символами имеет тип int и значение, определяемое реализацией.
Что касается лучшего пути, это зависит от того, что вы подразумеваете под лучшим: -)
Одна из возможностей - создать таблицу функций, которая в основном представляет собой массив структур, каждая из которых содержит слово и указатель на функцию.
Затем вы просто извлекаете слово из вашей строки и выполняете поиск в этом массиве, вызывая функцию, если найдете совпадение. Следующая программа на C показывает, как использовать таблицы функций. Что касается того, является ли это лучшим решением, я оставлю это на ваше усмотрение (это умеренно продвинутая техника) - вам может быть лучше придерживаться того, что вы понимаете.
#include <stdio.h>
typedef struct { // This type has the word and function pointer
char *word; // to call for that word. Major limitation is
void (*fn)(void); // that all functions must have the same
} tCmd; // signature.
// These are the utility functions and the function table itself.
void hello (void) { printf ("Hi there\n"); }
void goodbye (void) { printf ("Bye for now\n"); }
tCmd cmd[] = {{"hello",&hello},{"goodbye",&goodbye}};
// Demo program, showing how it's done.
int main (int argc, char *argv[]) {
int i, j;
// Process each argument.
for (i = 1; i < argc; i++) {
//Check against each word in function table.
for (j = 0; j < sizeof(cmd)/sizeof(*cmd); j++) {
// If found, execute function and break from inner loop.
if (strcmp (argv[i],cmd[j].word) == 0) {
(cmd[j].fn)();
break;
}
}
// Check to make sure we broke out of loop, otherwise not a avlid word.
if (j == sizeof(cmd)/sizeof(*cmd)) {
printf ("Bad word: '%s'\n", argv[i]);
}
}
return 0;
}
При запуске с:
pax> ./qq.exe hello goodbye hello hello goodbye hello bork
вы получите вывод:
Hi there
Bye for now
Hi there
Hi there
Bye for now
Hi there
Bad word: 'bork'