将字符数组转换为std::string以便传递到std::bitset中导致段错误

3
在你点踩之前请仔细阅读,这里有些有趣的内容。基本上我想要将一个类型为char的数组转换成一个std::string以便使用std::bitset操作,但是当我尝试在运行时创建bitset对象时,我会得到以下错误:

terminate called after throwing an instance of 'std::invalid_argument' what(): bitset::_M_copy_from_ptr Aborted (core dumped)

下面是代码:

#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;
}

我还尝试了一些其他类型的转换,使用std::stringstreamcharstd::string的指针,无论我传递什么参数到那个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;

1
字符串应包含字符'0''1',而不是整数01 - Bo Persson
2个回答

4

这是错误的:

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));

由于没有空终止符,您必须在std::string构造函数中告诉它何时停止(通过将4作为第二个参数传递)。

甚至更简单的方法是:

std::string str_BYTE_4 = "1000";

关于您遇到的“invalid_argument”异常,如果您阅读bitset的文档,就会发现它意味着您传递的字符串中包含了既不是'0'也不是'1'的字符(这些都是ASCII字符,其原始整数值分别为48和49)。请注意保留HTML标记。

尝试过了,但是为什么呢?如果我将一个字符初始化为零,它就是零,为什么不是1呢? - pandoragami
@pandoragami:我认为你没有理解字符'0'和数字0之间的区别。http://www.asciitable.com/ - John Zwinck
所以我不能使用“起始标题”或NULL作为值,但基本上我应该能够使用48或49? - pandoragami
文档很清楚:字符串只能包含ASCII字符'0''1'。SOH不允许。 - John Zwinck

2

std::string构建的

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

与从std::string构造的字符串没有任何区别。

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

std:string 中,您只有用整数值 1 表示的字符 char。这就是问题的根源。

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

您可以使用:

char BYTE_4[] = {'1', '0', '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"));

创建一个包含28个前导0和最后4位为1000的bitset


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接