我是一个在c中做项目的python程序员。我需要将字母映射到与它们对应的usb发送代码。在python中,我会在字典中进行硬编码。在C中我使用了一个巨大的switch
声明。有没有更好的办法?
switch(c){
case 'a':
return "x04";
break;
case 'b':
return "x05";
break;
case 'c':
return "x06";
break;
就我而言,我会创建一个查找表:
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"
等。所以虽然初始化表需要一些工作,你只需要在程序开始时执行一次 - 之后它只是一个数组查找。
假设您的系统使用的是ASCII或UTF-8字符编码,拉丁字母a-z是顺序的,您可以创建一个值数组:
char *sendcodes[] = { "0x04", "0x05", "0x06", ... };
然后你可以通过从有问题的字母中减去'a'
来索引它,给你一个从0到25的索引:
return sendcodes[c - 'a'];
您可以尝试使用并行数组,只要两个数组中的数据量相同即可。只需遍历第一个数组并使用变量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]);
}