2

因此,字符串带有值类型char。我想要一个值类型的字符串unsigned char。为什么我想要这样的东西是因为我目前正在编写一个将十六进制的大输入转换为十进制的程序,并且我正在使用字符串来计算结果。但是 char 的范围,即 -128 到 127 太小,范围为 0 到 255 的 unsigned char 可以完美地代替。考虑这段代码:

#include<iostream>
using namespace std;

int main()
{
    typedef basic_string<unsigned char> u_string;
    u_string x= "Hello!";

    return 0;
}

但是当我尝试编译时,它显示 2 个错误,一个是从 const char* 到 unsigned const char*_的 _invalid 转换,另一个是初始化 std::basic_string<_CharT, _Traits, _Alloc>::basic_string 的参数 1.. .(继续)

编辑:“为什么问题“将十六进制的大输入转换为十进制”需要使用字符串文字初始化 u_string?计算时,每移一次十六进制数,就乘以16,结果最多为16x9=144,超过127的限制,变成负数。另外,我必须像这样初始化它:

x="0"; x[0] -='0';

因为我希望它的价值为 0。如果变量为null,那么我不能对其执行操作,如果它是0,那么我可以。

所以我该怎么做?

4

2 回答 2

3

字符串文字是const char并且您将它们分配给const unsigned char.

你有两个解决方案:

首先,将字符串从标准字符串逐个元素复制到您的元素。

其次,为您的字符串类编写您自己的用户文字:

inline constexpr const unsigned char * operator"" _us(const char *s,unsigned int)
{
    return (const unsigned char *) s;
}

// OR 

u_string operator"" _us(const char *s, unsigned int len)
{
    return u_string(s, s+len);
}

u_string x = "Hello!"_us;
于 2013-09-15T10:08:28.560 回答
1

另一种解决方案是让您的编译器char视为无符号。为此有编译器标志:

  • MSVC:/J
  • GCC、Clang、ICC:-funsigned-char
于 2013-09-15T10:15:43.330 回答