2017-05-27 106 views
2

在您投票之前,请仔细阅读,它会变得有趣。基本上我想要将类型char数组转换为std::string以便使用std::bitset操作,但是当我尝试在运行时创建bitset对象时,出现此错误。将一个字符数组转换为std :: string以传入std :: bitset seg fault

扔 '的std :: invalid_argument' 的一个实例后终止叫什么()位集合:: _ 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; 
} 

我也尝试了一些其他类型的转换std::stringstream以及charstd::string的指针,无论我传递给std::bitset构造函数I得到相同的错误?

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

//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'',而不是整数'0'和'1'。 –

+0

这是否解决了它? – pandoragami

+0

它的工作原理!谢谢! – pandoragami

回答

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)。从

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

构造

+0

烨试过了,但为什么呢?如果我初始化一个字符为零它为什么不是1? – pandoragami

+0

@pandoragami:我认为你没有理解字符“0”和数字“0”之间的区别。 http://www.asciitable.com/ –

+0

所以我不能使用'开始标题'或NULL作为值,基本上,但我应该能够使用48或49? – pandoragami

2

std::string不大于所述std::string不同于

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

你只有char通过在std:string整数值1表示构成。这是问题的根源。

为了能够从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()); 

创建一个bitset,它的值由32个零位。

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

创建一个bitset,其值由28位领导是零,最后4位是1000

+0

感谢您的评论! – pandoragami

相关问题