从const char *参数中取出索引

我有以下代码:

int some_array[256] = { ... }; int do_stuff(const char* str) { int index = *str; return some_array[index]; } 

显然上面的代码会导致某些平台出现错误,因为* str实际上可能是负面的。

所以我想到了两种可能的解决方案:

  1. 在赋值时转换值( unsigned int index = (unsigned char)*str; )。

  2. 传递const unsigned char*代替。

编辑:这个问题的其余部分没有得到治疗,所以我把它移动到一个新的线程。

允许字符签名或未签名,具体取决于平台。 无符号范围的假设是导致您的错误的原因。

您的do_stuff代码不会将const char*视为字符串表示forms。 它将它作为一系列字节大小的索引用于查找表。 因此,在do_stuff内的字符串unsigned char上强制使用unsigned char类型没有任何问题(即使用您的解决方案#1)。 这将char重新解释为本地化为do_stuff函数实现的索引。

当然,这假设您的代码的其他部分确实将str视为C字符串。

char的签名确实取决于平台,但你知道的是char值和unsigned char ,转换是单射的。 因此,您绝对可以转换值以将查找索引与每个字符相关联:

 unsigned char idx = *str; return arr[idx]; 

你当然应该确保arr至少有UCHAR_MAX + 1元素。 (当sizeof(unsigned long long int) == 1 ,这可能会导致热闹的边缘情况,幸运的是很少见。)