如果s
在C ++中的类型为string
,s[n]
将返回char
,而不是unsigned char
。这给我带来了很多问题,因为我必须在任何地方进行类型转换。
以下代码不会打印“是”。
#include <string>
#include <iostream>
using namespace std;
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned short uint16;
typedef unsigned char uchar;
int main(int argc, char *argv[]) {
string s = "h\x8fllo world";
printf("%d\n", s[1]);
if (s[1] == 0x8f) {
printf("yes\n");
}
return 0;
}
我可以通过将上面的内容更改为if ((uchar*)(s[1] == 0x8f) {
来使其工作,但有太多事件发生。我真的希望[]
班上的string
运算符可以返回unsigned char
!!有没有办法做到这一点?
答案 0 :(得分:4)
不,std::string
是std::basic_string<char, ...>
,而且您无法或应该做些什么来改变它。
您可以强制执行char
无签名(some compilers allow this)并在任何地方粘贴断言,以防止您的代码使用签名的char
类型进行编译。
您可以切换为std::basic_string<unsigned char, ...>
甚至std::vector<unsigned char>
。
但是,就个人而言,我只是将角色与另一个角色(而不是整数)进行比较:
if (s[1] == '\x8f')
我认为无论如何这都是更好的代码。
答案 1 :(得分:4)
您应该可以使用std::basic_string<unsigned char>
(std::string
实际上只是typedef
到std::basic_string<char>
)。这意味着修改代码以使用新的typedef
代替std::string
,但这应该是一个相当简单的搜索和替换重构。
有关详细信息,请参阅Strings of unsigned chars。