从const char *参数中取出索引
我有以下代码:
int some_array[256] = { ... }; int do_stuff(const char* str) { int index = *str; return some_array[index]; }
显然上面的代码会导致某些平台出现错误,因为* str实际上可能是负面的。
所以我想到了两种可能的解决方案:
-
在赋值时转换值(
unsigned int index = (unsigned char)*str;
)。 -
传递
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
,这可能会导致热闹的边缘情况,幸运的是很少见。)