0

私はC++の初心者で、自分で実験するためにいくつかのコードを書こうとしています。

最近、デバッグできない問題に遭遇しました。

char acExpReason[128];
char acReason[] = "An error message is information displayed when an unexpected condition occurs, usually on a computer or other device. On modern operating systems.";

memcpy(acExpReason, acReason, sizeof(acExpReason));
std::string strExpReason(acExpReason);

VS2005 を使用して、デバッグするすべての行にブレークポイントを追加します。

2 行目のブレークポイントに到達すると、Autos の変数名と値の情報は次のようになります。

  • acReason 0x00f6f78c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ" char [147]

  • acExpReason 0x00f6f828 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̺" char [128]

3 行目のブレークポイントに到達すると、Autos の変数名と値の情報は次のようになります。

  • acExpReason 0x00f6f828 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̺" char [128]

  • " acReason 0x00f6f78c "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピュータまたはその他のデバイスで発生します。最新のオペレーティング システムでは." チャー [147]

4 行目のブレークポイントに到達すると、Autos の変数名と値の情報は次のようになります。

  • acExpReason 0x00f6f828 "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピューターまたはその他のデバイスで発生します。最新の ÌÌÌÌÌÌÌ̺ では" char [128]

  • " acReason 0x00f6f78c "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピュータまたはその他のデバイスで発生します。最新のオペレーティング システムでは." チャー [147]

  • strExpReason Bad Ptr

最後の行が実行された後、Autos の情報は次のようになります。

  • acExpReason 0x00f6f828 "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピューターまたはその他のデバイスで発生します。最新の ÌÌÌÌÌÌÌ̺ では" char [128]

  • " acReason 0x00f6f78c "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピュータまたはその他のデバイスで発生します。最新のオペレーティング システムでは." チャー [147]

  • strExpReason "エラー メッセージは、予期しない状況が発生したときに表示される情報で、通常はコンピューターまたはその他のデバイスで表示されます。最新の ÌÌÌÌÌÌÌ̺ では"

基本的に私のコードがやりたいことは、acReason[] に格納されている msg の完全な行を持つことです。また、固定長 (ここでは 128) の完全な msg のコピーがあります。

しかし、acExpReason と strExpReason (acExpReason の文字列バージョン) が、私が望まない奇妙な文字 "ÌÌÌÌÌÌÌ̺" で終わる理由がわかりません (この文字列を後で他の文字列と比較するために使用するため)。

memcpy、strcpy、および strncpy を使用してみましたが、それらはすべて、文字列の末尾に一連の奇妙な文字が含まれることになりました。

誰でも助けることができますか?よろしくお願いします。

4

3 に答える 3

4
std::string strExpReason(acExpReason);

このコンストラクターには、C スタイルの文字列が必要です。ただしacExpReason、終端のゼロバイトがないため、C スタイルの文字列ではありません。(コンストラクターは、文字列に含まれるバイト数をどのように知るのでしょうか?) 規則に従わなければなりません。

于 2013-01-15T15:02:05.593 に答える
3

C では、strcpy のようなすべての文字列関数と、C++ のコンストラクターもパラメーターとして受け取りますが、`\0` を含むバイトで終了するstd::string必要があります。char*char*

acExpReason には末尾にゼロがないため、すべての文字列関数はメモリ内の次の 0 バイトを探します。acReason の末尾には `\0` があります。通常の strcpy は 0 もコピーするため機能しますが、@VladLazarenko はバッファ サイズが小さすぎるため、すべてのメモリが上書きされると言います。

memcpy を機能させるには、バッファよりも 1 バイト少なくコピーし、バッファの最後のバイトを 0 にする必要があります。

memcpy(acExpReason, acReason, sizeof(acExpReason)-1);
acReason[sizeof(acExpReason)-1] = 0;
于 2013-01-15T15:02:14.103 に答える
2

stringイテレータ範囲を受け入れるコンストラクタを使用することもできます -

std::string strExpReason(acExpReason, acExpReason+sizeof(acExpReason));
于 2013-01-15T15:08:37.943 に答える