char
数组转换为std::string
以便使用std::bitset
操作,但是当我尝试在运行时创建bitset
对象时,我得到此错误。
在抛出' 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::stringstream
进行了一些其他类型的转换以及char
和std::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;
答案 0 :(得分:4)
这是错误的:
char BYTE_4[4] = { 1, 0, 0, 0};
std::string str_BYTE_4 = std::string(BYTE_4);
您需要的是一串数字,但您要存储原始字节1
和0
(不是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)。
答案 1 :(得分:2)
从
构建的std::string
char BYTE_4[4] = { 1, 0, 0, 0};
与从
构建的std::string
没有什么不同
char BYTE_4[4] = { 1, '\0', '\0', '\0'};
char
中只有1
由整数值std:string
表示。这就是问题的根源。
为了能够从std::bitset
构建std::string
,您需要std::string
仅包含字符'1'
或'0'
。因此,您需要使用字符'1'
和'0'
,而不是整数值1
和0
。
您可以使用:
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::bitset
构建std::string
。
符合它的价值:
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。