8

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

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

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

c_str()でnullターミネータを追加すると、文字列の長さが33になるため、エラーが発生します。文字列から1文字を引くと機能しますが、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を使用しています。

4

4 に答える 4

17

strcpy文字列の終わりを識別するためにNULLターミネータを探し、NULLを出力文字列にコピーするため、を使用することはできません。

astringからcharバッファに移行するので、最も簡単な方法は次を使用すること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]

編集:

余談ですが、VC6は古くからのコンパイラであり、リリースされたときには悪く、C ++標準が承認されたときにはひどいものであり、Microsoftでは完全にサポートされていません。何かがうまくいかなかった場合、彼らはあなたに話しかけることさえしません。できるだけ早くVC6を降りる必要があります。

于 2011-12-01T17:32:17.897 に答える
12

memcpyの代わりに使用してくださいstrcpy

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 
于 2011-12-01T17:31:25.347 に答える
1

strncpy()の代わりに使用strcpy()

strncpy(blocks[0].data, buffer.c_str(), 32); 
于 2011-12-01T18:43:11.980 に答える
-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文字より短い場合は処理しますか?次に、ヌルバイトを追加しますか?

于 2011-12-01T17:38:37.637 に答える