我有以下代码:
int some_array[256] = { ... };
int do_stuff(const char* str)
{
int index = *str;
return some_array[index];
}
Run Code Online (Sandbox Code Playgroud)
显然上面的代码会导致某些平台出现错误,因为*str实际上可能是负面的.
所以我想到了两个可能的解决方案:
在赋值(unsigned int index = (unsigned char)*str;)上转换值.
传递const unsigned char*代替.
编辑:这个问题的其余部分没有得到治疗,所以我把它移到一个新的线程.
的符号性char的确是依赖于平台的,但你知道的是,有尽可能多的价值char,因为是unsigned char和转换是单射.因此,您绝对可以转换值以将查找索引与每个字符相关联:
unsigned char idx = *str;
return arr[idx];
Run Code Online (Sandbox Code Playgroud)
你当然应该确保arr至少有UCHAR_MAX + 1元素.(这可能会导致欢闹的边缘情况sizeof(unsigned long long int) == 1,幸运的是,很少见.)