希望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')