2015-08-29 2 views
1

Я читаю файл с командами [a-zA-Z] [a-zA-Z0-9], т. Е. Двумя символами. Всего 43 команды, и я хотел бы преобразовать два символа в число (1..43).Лучший выбор для очень простой таблицы поиска

Как вы продолжите? Я думал о создании массива из 43 неподписанных трусов (два байта) каждый из которых соответствуют двум символам каждой команды, а затем делать что-то вроде:

//char1: first char of cmd, char2: second char of cmd, lut: array of 43 shorts. 
unsigned short tag; 
tag = (char1 << 8) | char2; 
for(int i=1;i<=43;i++) { 
    if(tag==lut[i-1]) return i; 
} 
return 0; 

Дела в том, что я не уверен, если это лучший способ сделать то, что я хочу. Я предполагаю, что с 43 элементами это не имеет значения, но этот список может увеличиться в будущем.

+0

мог бы использовать HashMap для отображения из командной строки на номер – amdixon

+0

Что «ЛУТ»? "Справочная таблица"? – stakx

+1

Это действительно зависит от того, что вы собираетесь делать с этой структурой данных. Для каждой цели нет идеальной структуры данных. – stakx

ответ

0

Вот такой метод, который я использовал для старого проекта. Один большой недостаток этого метода - таблица поиска, и перечисление зависит друг от друга и их необходимо синхронизировать. Я получил этот метод из онлайн-статьи довольно много лет назад, но не помню, где. Это полный пример:

#include <stdio.h> 
#include <string.h> 

#define CMDSIZE 2 

const char* cmd_table[] = { "qu", 
          "qr", 
          "fi", 
          "he"}; 

enum { CMD_QUIT, 
     CMD_QUIT_RESTART, 
     CMD_FILE, 
     CMD_HELP, 
     CMD_NONE }; 

int lookup(char command[]) 
{ 
    int i = 0; 
    int cmdlength = strlen(command); 
    for (i = 0; i < cmdlength; i++) 
    { 
    command[i] = tolower(command[i]); 
    } 

    const int valid_cmd = sizeof cmd_table/sizeof *cmd_table; 

    for (i = 0; i < valid_cmd; i++) 
    { 
    if (strcmp(command, cmd_table[i]) == 0) 
     return i; 
    } 
    return CMD_NONE; 
} 

int main() 
{ 
    char key_in[BUFSIZ]; 
    char command[CMDSIZE+1]; 
// Wait for command 
    do 
    { 
     printf("Enter command: "); 
     fgets(key_in, BUFSIZ, stdin); 
     key_in[strlen(key_in)-1] = '\0'; 
     strncpy(command, key_in, CMDSIZE); 
     command[CMDSIZE] = '\0'; 
     switch (lookup(command)) 
     { 
      case CMD_QUIT: 
     printf ("quit\n"); 
       break; 
      case CMD_QUIT_RESTART: 
       printf ("quit & restart\n"); 
       break; 
      case CMD_FILE: 
       printf ("file\n"); 
       break; 
      case CMD_HELP: 
       printf("help\n"); 
       break; 
      case CMD_NONE: 
       if(strcmp(key_in, "")) 
        printf("\"%s\" is not a valid command\n", key_in); 
       break; 
     } 
    } while (strcmp(command, "qu")); 
    return 0; 
} 

EDIT:

Я нашел статью, я упоминал:

https://www.daniweb.com/software-development/cpp/threads/65343/lookup-tables-how-to-perform-a-switch-using-a-string