2011-01-25 24 views
2

私はC++で文字配列(char * pData)を持っていますが、pDataからいくつかのデータをstd :: stringにコピーします。コードは次のようになります。char * to std :: string

std::string sSomeData(pData+8);//I want to copy all data starting from index 8 till end 

上記の文が実行されると、文字列には何も含まれません。 私はpDataが '\ 0'で終わっていないと思います。

よろしく、 Jame。

+3

どのデータを扱っているのか分かりませんか?いずれにしても、コードは適切なヌル終了文字列で動作する必要があります(少なくとも8文字であることを前提としています)。 – EboMike

答えて

6

あなたがpDataの大きさがわかっている場合は、コンストラクトから、イテレータのコンストラクタを使用することができます:nは、コピーしたい文字の数である

std::string sSomeData(pData + 8, pData + size_of_pData); 
+0

pData + size_of_pDataを使用すると、コピーが有効な境界を超えます。これを修正するには、開始オフセットをマイナスする必要があります。 – YeenFei

+4

@YeenFei: 'std :: string(iterator begin、iterator end)'コンストラクタは、 'end'イテレータによって参照される文字を除いた文字*をコピーします。最後の1文字を超えるポインタをここに渡すことは正しいです。 – pmdj

+0

@pmjordan、私はそれをsizeof(pData)の代わりにpData(pDataによる文字列ポインタの長さ)として解釈していました... – YeenFei

1

使用std::string sSomeData(pData+8, pData+8+n)を。

+0

'pData + 8 + n 'は不正なアドレスを参照します。 (あなたは 'pData + n 'を意味していましたが、それは既にVictorによって説明されています) – sbi

+0

@sbi:実際には、nはコピーしたい文字の数で、ここでは(size-8);-) –

+1

@ヴィクトールと@オズワルド:その脳裏には申し訳ありません。 – sbi

2

データがNULLで終了するかどうかわからない場合は、データのサイズ(つまり、そこにいくつの文字があるか)を知っておく必要があります。それ以外の場合は、コピーする方法はありません。サイズを知っているときは、文字列コンストラクタで指定することができます。以下にサンプルコードを示します。

+0

sizeof(pData)演算子を使ってサイズを計算できますか? –

+1

いいえ(一般的ではありません)。サイズを明白に知る必要があります。 – Naveen

+1

@JStephan: 'strlen(pData)'を使って文字列の長さを計算することができます。*それがヌルで終わっている場合は*ですが、ソリューションの他の変種を使うこともできます。 –

関連する問題