非常简单的查找表的最佳选择

时间:2015-08-29 14:17:11

标签: c

我正在读取一个命令为[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个元素才有意义,但这个名单可能会在未来增加。

1 个答案:

答案 0 :(得分: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;
}

修改

我找到了我提到的文章:

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