0

問題は、コンソール アプリケーションがユーザーから文字列を取得することです。

string input;
cin >> input;

次に、この文字列を char* に変換して関数に渡します。

char *argument = NULL;
argument = (char *) input.c_str();

私の関数は次のように宣言されています:

int function (char *input, char *output)

このコードをデバッグするとアクセス違反が発生するので、すべてを定義しようとしました。

strcpy(argument, input.c_str());

しかし、再びアクセス違反とBad Ptrが発生しました!! どんな手掛かり?

4

2 に答える 2

3

あなたの問題は、 c_str() が aconst char*ではなく a を返すことchar*です。c_str() によって返される文字シーケンス内の文字を変更することはできません。

したがって、次のことが必要です。

const char *argument = input.c_str();

キャストを行わなかった場合、コンパイラはこのエラーをキャッチします。

argument = (char *) input.c_str();

キャストなし:

argument = input.c_str();

コンパイルされていない可能性があります(または、コンパイルされている可能性がありますが、大きな太い警告が添付されています)。

さらに、後で を変更するinputと、c_str() から取得したポインターは無効になり、それにアクセスすると未定義の動作が発生します。

文字列のバージョンが必要な場合char*は、それをコピーする必要があります。

char *argument = new char[input.length() + 1];
std::strcpy(argument, input.c_str());

argument不要になったら解放することを忘れないでください。

delete[] argument;
于 2013-02-24T09:24:21.057 に答える
1
argument = (char *) input.c_str(); 
           ^^^^^^^^ you don't need this. further c_str() returns a "const pointer to char"
                    not "pointer to char". 

int function (char *input, char *output)
             ^^^^^^^^^^^^|________ It should be "string input" or "string &input"
于 2013-02-24T09:19:30.687 に答える