c将某些值映射到其他值的首选方法是什么?

时间:2018-02-13 19:50:39

标签: c

我是一名正在用c做项目的python程序员。我需要将字母映射到与它们对应的usb发送代码。在python中,我会在字典中进行硬编码。在C中我使用了一个巨大的switch语句。还有更好的方法吗?

switch(c){
    case 'a':
        return "x04";
        break;
    case 'b':
        return "x05";
        break;
    case 'c':
        return "x06";
        break;

3 个答案:

答案 0 :(得分:2)

就我而言,我创建了一个查找表:

static char sendcodes[256][5]; // declared outside of any function;
                               // "static" means it's only visible
                               // within the current source file

void init_sendcodes( void )
{
  for ( unsigned char c = 'a'; c <= 'z'; c++ )
    sprintf( sendcodes[c], "%02hhx", c - 'a' + 4 );
}

char *mapSendcode( char c )
{
  return sendcodes[c];
}

请注意,此代码假定'a''z'是连续的编码(ASCII或UTF-8)。如果他们不是,那么,您将不得不使用多个循环。

完成后,sendcode['a']包含字符串"0x04"sendcode['b']包含"0x05"等。因此,虽然初始化表需要一些工作,你只需要在程序开始时执行一次 - 之后它只是一个数组查找。

答案 1 :(得分:1)

假设您的系统使用的是ASCII或UTF-8字符编码,拉丁字母a-z是连续的,您可以创建一个值数组:

'a'

然后你会通过从有问题的字母中减去return sendcodes[c - 'a']; 来索引它,给你一个从0到25的索引:

On Hold Begins

答案 2 :(得分:0)

您可以尝试使用并行数组,只要两个数组中的数据量相同即可。只需遍历第一个数组并使用变量i作为第二个数组的索引:

char array1[]  = {'a', 'b', 'c'};
char *array2[] = {"x04", "x05", "x06"};

for (int i=0; i<sizeof(array1)/sizeof(array1[0]); i++)
{
    printf("%s\n", array2[i]);
}