2017-05-27 41 views
2

に渡す前に、これを読んで慎重に読んでください。面白いですね。基本的にはstd::bitset操作を使用するためにタイプcharの配列をstd::stringに変換したいのですが、実行時にbitsetオブジェクトを作成しようとするとこのエラーが発生します。charの配列をstd :: stringに変換してstd :: bitset segフォールト

)のインスタンス投げた後、いわゆる '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; 
} 

I 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''と '」れていない28先行ビットから成り整数「0」と「1」。 –

+0

それで解決できますか? – pandoragami

+0

それは動作します!ありがとう! – pandoragami

答えて

4

これは間違っている:あなたが必要なもの

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

は数字の文字列ですが、( "1" と "0" をASCIIではない)生のバイト10を格納しています。このようにそれを修正:

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

をヌルターミネータがないので、あなたはここで、(2番目の引数として4を渡すことで)停止するstd::stringコンストラクタを伝える必要があります。

アンさらに簡単な方法は、次のようになります。あなたが得たinvalid_argument例外については

std::string str_BYTE_4 = "1000"; 

、あなたがbitsetのドキュメントを読めば、あなたはそれはあなたがどちらもなかった文字が含まれる文字列を渡すことがわかります'0''1'(ASCII文字で、その整数値は48と49です)。

+0

うん、それを試してみましたが、なぜですか?私がcharをゼロに初期化すると、なぜゼロでないのですか? – pandoragami

+0

@pandoragami:文字「0」と数字「0」の違いを理解できていないと思います。 http://www.asciitable.com/ –

+0

だから、基本的には「見出しの開始」やNULLを使用することはできませんが、48や49を使用できるはずです。 – pandoragami

2

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

から構成std::stringあなたのみstd:stringの整数値1によってchar表さた

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

から構成std::stringよりも違いはありません。それが問題の原因です。

std::stringからstd::bitsetを構築できるようにするために、あなただけの文字'1'または'0'を含むようにstd::stringを必要としています。したがって、'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")); 

が作成bitsetその値はゼロであり、最後の4ビットは、1'` 1000

+0

コメントありがとう! – pandoragami

関連する問題