2015-09-25 7 views
5

私はstd :: string変数を持っています。そして、私はそれに署名されていない文字の配列からいくつかのバイトを配置する必要があります。私は最初のバイトと足を知っています。memcpy()関数を使用して、unsigned char配列からstd :: stringにバイトを置きます。

私はstd :: string :: assign関数を使用できます。私はそれをやった。

しかし、memcpy関数を使用して正しい方法でその問題を解決したいと思います。

std::string newString; 
memcpy(&newString, &bytes[startIndex], length); 

私はそれが間違っていることを知っています。私は研究して、いくつかのアイデアをstd :: vectorを使って見つけました。

この問題の最も洗練された解決方法をお探しください。あなたはすべてのデータを受信するための適切なサイズのバッファが存在することになるように、文字列のサイズを設定し、あなたはもちろんのdata()

std::string newString; 
newString.resize(length); 
memcpy((char*)newString.data(), &bytes[startIndex], length); 

から取得ポインタのうち、const性をキャストする必要が

+4

なぜあなたは 'assign()'が "正しい方法"ではないと思いますか? – Barry

+0

"正しい方法で"は "私はそれが間違っていることを知っています" =? – crashmstr

+0

@Barry私は2つの異なる方法でそれを解決したい。私はC++言語を学んでいます。この解決法の発見は私のためには面白いです:) –

答えて

11

我々だけSTRIを構築しているのでNG、2回の反復子を取るstd::stringコンストラクタがあります:

std::string newString(&bytes[startIndex], &bytes[startIndex] + length); 

を私たちは、あなたが、必要がある文字列を構築していないし、代わりに既存のものに割り当てる場合:私たちが提供することができます

template< class InputIt > 
basic_string(InputIt first, InputIt last, 
       const Allocator& alloc = Allocator()); 

依然としてassign()を使用することをお勧めします。

oldString.assign(&bytes[startIndex], &bytes[startIndex] + length); 

しかし、あなたが実際にいくつかの理由でmemcpy()を主張するなら、あなたは文字列が実際にコピーされるのに十分なデータを持っていることを確認する必要があります。それは、その関数が何のためにあるのかを正確です。そして、宛先アドレスとして&str[0]を使用してコピーしてください。&dagger;

oldString.resize(length); // make sure we have enough space! 
memcpy(&oldString[0], &bytes[startIndex], length); 

&短剣。 Pre-C++ 11文字列がメモリに連続して格納されるという保証はありませんが、実際にはこれはとにかく実行されました。

+1

なぜdownvote? – Barry

+0

IDK。誰かが答えを好きではなかったように見える – NathanOliver

+0

'&bytes [startIndex + length]'はあなたが持っているものと一貫性があると思う(プログラマが実行したポインタ演算なし)。しかし、 'const char *'と長さを取る文字列ctorもあります: 'std :: string newString(&bytes [startIndex]、length);' –

-1

これは未定義の動作の領域にありますが、あまり標準ではありません。

+0

'&newString'に? – Barry

+0

あなたが正しいと固定 – shoosh

-3

それはハックだとあなたは間違った方法を言ったとしてではなく、それはstd::stringが連続したストレージを持っていることをSTLを保証するので可能である。もちろん

std::string str(32, '\0'); 
std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY"); 

、あなたは(私はちょうどにstrcpyを使用したのと同じ方法でstd::memcpyを使用することができますコピーヌルで終了する文字列)...あなたの場合

str.resize(length); 
memcpy(const_cast<char*>(str.data()), bytes + startIndex, length); 
+0

そして、あなたがコピーしている文字列が32バイトを超えていたら? – Barry

+0

もちろん、Nevermoreが "違法な方法"を意味するものを明確にするために、よくフィットする文字列を適切に整理する必要があります(注意してください、 'resize()'ではなく 'reserve()') – Nevermore

+2

[*データからアクセスされる文字配列を変更する未定義の動作*](http://en.cppreference.com/w/cpp/string/basic_string/data)です。 'std :: stringに連続した記憶領域があることをSTLが保証しているから' –

関連する問題