Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无符号字符值类型的基本\u字符串_C++_String_Char_Unsigned - Fatal编程技术网

C++ 无符号字符值类型的基本\u字符串

C++ 无符号字符值类型的基本\u字符串,c++,string,char,unsigned,C++,String,Char,Unsigned,因此,字符串的值类型为char。我想要一个值类型为无符号字符的字符串。我之所以想要这样的东西,是因为我目前正在编写一个程序,将十六进制的大量输入转换为十进制,并使用字符串计算结果。但是char的范围(从-128到127)太小了,范围为0到255的无符号char可以很好地工作。考虑这个代码: #include<iostream> using namespace std; int main() { typedef basic_string<unsigned char>

因此,字符串的值类型为
char
。我想要一个值类型为
无符号字符
的字符串。我之所以想要这样的东西,是因为我目前正在编写一个程序,将十六进制的大量输入转换为十进制,并使用字符串计算结果。但是char的范围(从-128到127)太小了,范围为0到255的无符号char可以很好地工作。考虑这个代码:

#include<iostream>
using namespace std;

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

    return 0;
}
#包括
使用名称空间std;
int main()
{
typedef basic_字符串u_字符串;
u_string x=“你好!”;
返回0;
}
但是当我尝试编译时,它显示了两个错误,一个是从常量字符*到无符号常量字符*的无效转换,另一个是初始化std::basic\u string::basic\u string的参数1…(继续)

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

x=“0”;x[0]-='0'

因为我希望它的值为0。如果变量为null,则无法对其执行操作;如果变量为0,则可以


那么,我该怎么办呢?

字符串文字是
常量字符
,您正在将它们分配给
常量无符号字符

您有两种解决方案:

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

其次,为string类编写自己的:

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;

字符串文字是
const char
,您将它们分配给
const unsigned char

您有两种解决方案:

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

其次,为string类编写自己的:

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;

另一种解决方案是让编译器将
char
视为无符号。有以下编译器标志:

  • MSVC:
    /J
  • GCC、Clang、ICC:
    -funsigned char

    • 另一种解决方案是让编译器将
      char
      视为未签名。有以下编译器标志:

      • MSVC:
        /J
      • GCC、Clang、ICC:
        -funsigned char

      好的,如何在默认情况下将它们视为常量无符号字符?您不能,但您可以拥有您的文字。好的,如何在默认情况下将它们视为常量无符号字符?您不能,但您可以拥有您的文字。为什么会出现“将十六进制的大量输入转换为十进制”的问题需要使用字符串文字初始化
      u_字符串
      ?@Robᵩ 请看我的编辑。@user2653125您的编辑仍然不能解释为什么需要字符串文字进行初始化。这并不能回答我的问题。我的意思是,你为什么关心初始化?为什么要使用字符串呢?
      std::vector
      有什么问题?为什么“将大量十六进制输入转换为十进制”问题需要使用字符串文本初始化
      u_字符串
      ᵩ 请看我的编辑。@user2653125您的编辑仍然不能解释为什么需要字符串文字进行初始化。这并不能回答我的问题。我的意思是,你为什么关心初始化?为什么要使用字符串呢?
      std::vector
      有什么问题?我想在代码中这样做,因为我必须将代码作为解决方案上传到在线站点。我想在代码中这样做,因为我必须将代码作为解决方案上传到在线站点。