从const char *参数中取出索引

时间:2017-01-24 10:42:11

标签: c++ c string

我有以下代码:

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*

  3. 编辑:这个问题的其余部分没有得到处理,所以我把它移到了一个新的线程。

2 个答案:

答案 0 :(得分:5)

ClassLoader的签名确实取决于平台,但您所知道的是char的值与char的{​​{1}}一样多,并且转换是单射的。因此,您绝对可以转换值以将查找索引与每个字符相关联:

unsigned char

您当然应该确保unsigned char idx = *str; return arr[idx]; 至少有arr个元素。 (这可能会导致UCHAR_MAX + 1时出现欢闹的边缘情况,幸运的是很少见。)

答案 1 :(得分:4)

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

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

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