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

问题描述 投票:1回答:3

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

switch(c){
    case 'a':
        return "x04";
        break;
    case 'b':
        return "x05";
        break;
    case 'c':
        return "x06";
        break;
c
3个回答
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
投票

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

char *sendcodes[] = { "0x04", "0x05", "0x06", ... };

然后你可以通过从有问题的字母中减去'a'来索引它,给你一个从0到25的索引:

return sendcodes[c - 'a'];

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]);
}
© www.soinside.com 2019 - 2024. All rights reserved.