1

私はconst charを持っています

const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";

DWORD* example2 = "\xAA\xBB\xCC\xDD";

example1 の最後の 4 バイトを example2 の最後の 4 バイトに変更したいのですが、C++ で何ができますか?

私は試してみましたmemcpyが、うまくstrcpyいきstrcpy_sませんでした

4

5 に答える 5

9

定数配列を変更しないでください!
本質的に一定のオブジェクト/変数を変更すると、Undefined Behaviorが発生します。
やらないでください。それのコピーを作成し、そのコピーを変更するか、同じ配列を変更する場合は、単にそれを として宣言しないでくださいconst

于 2013-01-17T14:49:00.907 に答える
3
  1. 定数文字列を変更しないでください。
  2. const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";ここで、文字列にはいくつかの NULL 文字列ターミネータがあります。<string.h>これは(strlen() などの) の関数では機能しません。
  3. 代わりにmemcpymemset関数を使用して、バイナリ文字列の長さを知った後にのみ追加します。
  4. 結果を文字配列に格納しますが、データが原因で通常の文字列として機能するとは想定しないでください。
于 2013-01-17T14:55:50.280 に答える
2

example[]char 配列は次のように定義されているため、const 変更できません。

1) const char 配列をこのように変更すると、コンパイルでエラーが発生するはずです。

example[2] ='R';

memcpy2)または経由でconst char 配列を変更すると、警告が表示されます。strcpy

に変更します

char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";

strcpyまた、文字配列が途中に含まれているため使用できません。x00これは機能に影響しstrcpyます。char 配列で見つかったstrcpy時点で停止するためx00

example[]char 配列は途中に含まれているため、 withx00の長さを見つけることは正しく機能しません。この場合、代わりに使用することをお勧めします。example[]strlensizeof(example)

ここでは、コピーを作成する方法について説明します。

char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
DWORD* example2 = "\xAA\xBB\xCC\xDD";

if (sizeof(example)>=sizeof(example2))
     memcpy(example+sizeof(example)-sizeof(example2), example2, sizeof(example2));
于 2013-01-17T14:51:00.897 に答える
0

const 変数は変更できません。これは仕様によるものです。ac 文字列の場合、文字列 const の内容または文字列 const へのポインターを取得できます。

const 文字配列として定義しているため、ポインターは暗黙的に const であり、内容は明示的に const です。

const char * const mystring = "hello"

この場合、最初の「const」は左に適用しようとする (何もない) ため、右に (char 型に) 適用されます。したがって、文字列の内容は変更されない場合があります。2 番目の const は左に適用しようとするため、ポインター自体を const にします。つまり、mystring ポインターは常に、"hello" の "h" がメモリ内にある場所を指している必要があります。

その後、私が試してみると:

mystring[0] = "y"

また

mystring = "gooodbye!"

彼らはうまくいかないでしょう。最初または2番目のconstをそれぞれ削除すると、それらを機能させることができます。

const の目的により、事前に「この変数は変更できません」と言うことができます。つまり、変更すると問題が発生するということです。通常、インスタンス化後に変更したくない変数には常に const を使用する必要があります。

于 2013-01-17T15:20:32.313 に答える
0

定数配列を含む定数は絶対に変更しないでください。上記のものを変更したい場合は、そのコピーを作成し、コピーを変更します。RasmusKaj が指摘したように、ソース文字列にはゼロ文字が含まれているため、ここでは strcpy は役に立ちません。コピーの作成には memcpy を使用してください。

于 2013-01-17T14:50:38.993 に答える