将字符数组转换为 std::string 以传递到 std::bitset seg 错误

Converting an array of chars to std::string in order to pass into std::bitset seg fault

本文关键字:std bitset 错误 seg string 数组 字符 转换      更新时间:2023-10-16

在你投反对票之前,请仔细阅读,它确实很有趣。基本上,我想将数组类型转换为char std::string以便使用std::bitset操作,但是当我尝试在运行时创建bitset对象时,出现此错误。

在抛出"std::invalid_argument"实例后终止调用 what((: bitset::_M_copy_from_ptr 中止(核心转储(

这是代码

#include <iostream>
#include <cstdlib>
#include <bitset>
int main()
{
    char BYTE_4[4] = { 1, 0, 0, 0};
    std::string str_BYTE_4 = std::string(BYTE_4);
    std::bitset<32> str_BYTE_4_bit( str_BYTE_4);//crash here
    std::cout<<"str_BYTE_4_bit. "<<str_BYTE_4_bit<<std::endl;
    return 0;
}

我还尝试了一些其他类型的转换,其中包含charstd::stringstd::stringstream和指针,无论我传递到该std::bitset构造函数中的内容,我都会收到相同的错误?

这些只是我注释掉并从上面的代码中删除的片段,以显示我尝试过的内容。

//char* BYTE_4 = new char[4];
    //std::stringstream SS;
    //std::string str_BYTE_4 = "0101";
    //SS << BYTE_4;
        //str_BYTE_4 = SS.str();
    //for(int index = 0; index < 4; index++)
        //    str_BYTE_4 += BYTE_4[index];
    //std::string *str_BYTE_4 = new std::string[4];
    //for( int index = 0; index < 4; index++)
        //    BYTE_4[index] = rand()%255;
这是

错误的:

char BYTE_4[4] = { 1, 0, 0, 0};
std::string str_BYTE_4 = std::string(BYTE_4);

您需要的是一串数字,但您存储的是10的原始字节(不是 ASCII"1"和"0"(。 像这样修复它:

char BYTE_4[4] = { '1', '0', '0', '0'};
std::string str_BYTE_4 = std::string(BYTE_4, sizeof(BYTE_4));

由于没有 null 终止符,因此必须告诉 std::string 构造函数在哪里停止(通过将 4 作为第二个参数传递(。

更简单的方法是:

std::string str_BYTE_4 = "1000";

至于你得到的invalid_argument异常,如果你阅读了bitset的文档,你会看到这意味着你传递了一个字符串,其中包含一个既不'0'也不'1'的字符(那些是 ASCII 字符,其原始整数值为 48 和 49(。

构造

自的std::string

char BYTE_4[4] = { 1, 0, 0, 0};

与构造的std::string没有什么不同

char BYTE_4[4] = { 1, '', '', ''};

您只有由std:string1的整数值表示的char。这就是问题的根源。

为了能够从std::string构造std::bitset,您需要std::string仅包含字符'1''0'。因此,您需要使用字符'1''0',而不是整数值10

您可以使用:

char BYTE_4[] = {'1', '0', '0', '0', ''};
std::string str_BYTE_4 = std::string(BYTE_4);

char BYTE_4[4] = {'1', '0', '0', '0'};
std::string str_BYTE_4 = std::string(BYTE_4, 4);

为了能够从std::string构建std::bitset.

对于它的价值:

std::bitset<32> str_BYTE_4_bit(std::string());

创建一个值由 32 个零位组成的bitset

std::bitset<32> str_BYTE_4_bit(std::string("1000"));

创建一个bitset,其值由 28 个前导位组成,这些位为零,最后 4 位为 1000。