2011-12-01 9 views
5

char [32]だけを含む構造体を使用してバイナリファイルに書き込んでいます。私は基本的に文字列配列のさまざまな計算を実行し、結果を連結することによって各データブロックをフォーマットする必要があります。私はNULL終了なしの文字配列にstd :: stringをコピーしようとしています。私がこれを読むほど、私はもっと混乱します。私が行う場合:C++ str :: stringをヌル終了のない文字配列にコピーする

struct block{ 
    char data[32]; 
}; 
block blocks[2048]; 
std::string buffer; 

buffer = "12345678123456781234567812345678"; 
strcpy(blocks[0].data, buffer.c_str()); 

は、私は、文字列から1つの文字を引く場合)(c_strとヌルターミネータを追加すると、文字列の長さ33になりますので、それは動作しますが、エラーを取得し、その後私は、NULLターミネータを持っています私は欲しくない。

strcpy(blocks[0].data, "12345678123456781234567812345678"); 

しかし、多くの場合、さまざまな配列の異なる文字列を連結する必要があるため、最初に文字列を作成したいと考えています。たとえば、私はstd :: stringでこれを行うことができます:

std::string buffer = stringArray1[0] + stringArray2[0]; 
strcpy(blocks[0].data, buffer.c_str()); 

しかし、私は再びヌルターミネーターを持っています。私はちょうどヌルターミネーターなしでstd :: stringの文字を正確にコピーしたいと思います。

私はVC++ 6.0を使用しています。

+5

あなたはVC++ 6.0はちょうどIE 6 Hidiousのようなものであることを知っています。あなたがコンパイラを切り替える位置にいる場合は、そう速く行います。 –

+0

ありがとうございました。私はmemcpyを使用して終了しました。私は誤ってstd :: string.dataの代わりにstd :: string.c_strを使用していました。また、通常はVS2010を使用していますが、これはVS6.0を超えるものをサポートするように更新されていない古いライブラリが必要な旧製品です。 –

答えて

10

利用memcpyの代わりstrcpy、それはそれはそこだものです:あなたがにNULLをそれが文字列の終わりを識別するためにNULLターミネータを探すためstrcpyを使用して、コピーすることはできません

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 
+5

C++で 'std :: copy'を使うのに何も問題ありません。 –

+2

@ AlfP.Steinbach:もちろんです。OPがすでに持っているものに最も近いので、私は 'memcpy'を選びました、そして、彼らはそれを快適に使うでしょう。私はあなたが最初に来たら 'std :: copy'バージョンでは同じことは言えません。 – Jon

+0

まさに私が必要としたもの。ありがとう!私はstd :: copyにも慣れ親しんでいくつもりですが、あなたは正しいです:私はmemcpyを右に押してしまい、うまくいきました。 –

15

出力文字列。

あなたはstringから文字バッファーに行くしているので、最も簡単なものはstd::copyを使用することです:

#include <algorithm> 

static const size_t data_size = 32; 
struct block{ 
    char data[data_size]; 
}; 

/* ... */ 

std::string buffer = stringArray1[0] + stringArray2[0]; 
std::copy(buffer.begin(), buffer.end(), blocks[0].data); 

そして、ところで、あなたはvector<char>を使用することができるかもしれない、というよりchar data[32]

EDIT:

アン余談:VC6はそれが出てきた時にC++標準が批准されたとき、ひどい悪かった古代のコンパイラであり、マイクロソフトによって完全にサポートされていません。もし何かが間違っていたら、彼らはあなたと話しません。できるだけ早くVC6から降りてください。

+0

@ニム:どうですか? –

+0

+1、私によく見えます! :) – Nim

+0

回答と提案をありがとう。私は簡単にmemcpyを使ってしまいましたが、今後はこれらの方法に精通しています。 –

-1

使用ところで

memcpy(blocks[0].data, buffer.c_str(), buffer.size()); 
memcpy(blocks[0].data, buffer.c_str(), 32); 
memcpy(blocks[0].data, buffer.c_str(), buffer.size() > 32 ? 32 : buffer.size()); 
std::copy(buffer.begin(), buffer.end(), blocks[0].data). 

以下のいずれかの行は、文字列が32文字より短い場合、あなたはケースを扱うのですか? nullバイトを追加しますか?代わりにstrcpy()

+1

いいえ、 'memcpy'は最初のパラメータとして宛先を受け取ります - ' string'の 'c_str()'を渡すことは役に立たない... – Nim

+2

マイナーnitpick: 'buffer.data()'は 'buffer.c_str (違いはありません)。 – Jon

+1

memcpyのシグネチャは 'void * memcpy(void * destination、const void * source、size_t num)'です。 – bames53

0

使用strncpy()

strncpy(blocks[0].data, buffer.c_str(), 32); 
関連する問題