希望std::string::operator[]可以返回无符号字符 > S/< >是C++中的代码> >字符串< /> >, s[n] < /Calp>将返回 char < /代码>,而不是未签名char < />代码>。这给我带来了很多问题,因为我必须到处进行类型转换

希望std::string::operator[]可以返回无符号字符 > S/< >是C++中的代码> >字符串< /> >, s[n] < /Calp>将返回 char < /代码>,而不是未签名char < />代码>。这给我带来了很多问题,因为我必须到处进行类型转换,c++,string,C++,String,以下代码不会打印“是” #包括 #包括 使用名称空间std; typedef无符号长ulong; typedef无符号整数单元; typedef无符号短uint16; typedef无符号字符; int main(int argc,char*argv[]){ 字符串s=“h\x8fllo-world”; printf(“%d\n”,s[1]); 如果(s[1]==0x8f){ printf(“是\n”); } 返回0; } 如果((uchar*)(s[1]==0x8f){,我可以将上面的更改为

以下代码不会打印“是”

#包括
#包括
使用名称空间std;
typedef无符号长ulong;
typedef无符号整数单元;
typedef无符号短uint16;
typedef无符号字符;
int main(int argc,char*argv[]){
字符串s=“h\x8fllo-world”;
printf(“%d\n”,s[1]);
如果(s[1]==0x8f){
printf(“是\n”);
}
返回0;
}

如果((uchar*)(s[1]==0x8f){,我可以将上面的更改为
,但出现的次数太多了。我真的希望
[]
string
类上的
运算符可以返回一个
无符号字符
!!有什么方法可以做到这一点吗?

没有,
std::string
std::basic_string
,您不能也不应该做任何更改

您可以强制实现的
char
不带符号(),并在任何地方粘贴断言,以防止代码使用带符号的
char
类型编译

您可以切换到
std::basic_string
甚至
std::vector

但是,就个人而言,我只是将该字符与另一个字符(而不是整数)进行比较:

()
无论如何,我认为这是更好的代码。

不,
std::string
std::basic_string
,您不能也不应该做任何更改

您可以强制实现的
char
不带符号(),并在任何地方粘贴断言,以防止代码使用带符号的
char
类型编译

您可以切换到
std::basic_string
甚至
std::vector

但是,就个人而言,我只是将该字符与另一个字符(而不是整数)进行比较:

()
无论如何,我认为这是更好的代码。

您应该能够使用
std::basic_string
std::string
实际上只是
typedef
std::basic_string
)。这意味着修改代码以使用新的
typedef
而不是
std::string
,尽管这应该是一个相当简单的搜索和替换重构


有关更多详细信息,请参阅。

您应该能够使用
std::basic_string
std::string
实际上只是
typedef
std::basic_string
)。这意味着修改代码以使用新的
typedef
而不是
std::string
,尽管这应该是一个相当简单的搜索和替换重构


请参阅以获取更多详细信息。

(1)查看具有
std::uint16\t
和类似内容的cstdint标头。(2)使用
std::vector
?“这给我带来了很多问题,因为我必须在所有地方进行类型转换。”当您决定在所有地方使用
无符号字符时,您不是为自己制造了问题吗?”?你这样做的原因是什么?
如果((uchar*)(s[1]==0x8f)
不是你想写的,是吗?更多关于
char
签名的信息:(1)查看具有
std::uint16\t
和类似内容的cstdint头。(2)使用
std::vector
?“这给我带来了很多问题,因为我必须在任何地方进行类型转换。”当你决定使用
无符号字符时,你不是为自己制造了问题吗?
原因是什么?
如果((uchar*)(s[1]==0x8f)
不是你想写的,是吗?更多关于
char
符号性:与
char
常量而不是
int
常量相比,显然是正确的做法。谢谢@lightness在轨道上比赛。应该想到这一点。使用
'\x8f'
的诀窍很好!@codingFun:我不会l这是一个“把戏”;首先,这是默认的、显而易见的事情!:)(正如赫斯基所说)@codingFun:如果你想让人们正确地理解你,我建议你戒掉这个习惯。:)会的。谢谢@lightness-races-in-orbit。与
char
常量相比,而不是
int
常量似乎显然是正确的做法。谢谢@lightness-races-in-orbit。应该想到这一点。使用
'\x8f'
的诀窍很好!@codingFun:我不会称之为“诀窍”“首先,这是默认的、显而易见的事情!:)(正如赫斯基所说)@codingFun:如果你想让人们正确理解你,我建议你戒掉这个习惯。:)会的。谢谢@lightness-races-in-orbit。谢谢@Trebor_Rude。我也喜欢你的答案。谢谢@Trebor_Rude。我也喜欢你的答案。
#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 (s[1] == '\x8f')