1

私は C++ を初めて使用し、まだすべての概念を完全に把握していないため、この関数が機能しない理由に困惑しています。私は現在家にいないので、まだコンパイラ エラーを投稿することはできません。家に帰り次第投稿します。

これが関数です。

const char * ConvertToChar(std::string input1, std::string input2) {
    // Create a string that you want converted
    std::stringstream ss;
    // Streams the two strings together
    ss << input1 << input2;
    // outputs it into a string
    std::string msg = ss.str();
    //Creating the character the string will go in; be sure it is large enough so you don't overflow the array
    cont char * cstr[80];
    //Copies the string into the char array. Thus allowing it to be used elsewhere.
    strcpy(cstr, msg.c_str());

    return * cstr;
}

2 つの文字列を連結して変換し、const char * を返すように作られています。これは、使用したい関数が const char ポインターを渡す必要があるためです。

4

2 に答える 2

3

このコードは、ローカル (スタック) 変数へのポインターを返します。呼び出し元がこのポインターを取得すると、そのローカル変数はもう存在しません。これはしばしばダングリング参照と呼ばれます。

std::stringC スタイルの文字列に変換する場合は、 を使用しますstd::string::c_str()

したがって、2 つの文字列を連結して C スタイルの文字列を取得するには、次のようにします。

std::string input1 = ...;
std::string input2 = ...;

// concatenate
std::string s = input1 + input2;

// get a c-style string
char const* cstr = s.c_str(); 
// cstr becomes invalid when s is changed or destroyed
于 2012-12-19T14:51:56.760 に答える
1

エラーが何であるかを知らずに言うのは難しいですが、この行:

const char* cstr[80];

間違っているようです: 80 個のポインターの配列を作成します。暗黙的にポインターに変換すると、型は になりchar const**、引数として に渡されるとエラーが発生するはずですstrcpy。return ステートメントでの逆参照は、 を記述した場合と同じcstr[0]であり、配列の最初のポインターを返します。 —配列の内容が初期化されていないため、これは未定義の動作です。

先に進む前に、関数が何を返す必要があるかを定義する必要があります。その型だけでなく、ポイントされたメモリがどこに存在するかを定義する必要があります。これには、次の 3 つの解決策があります。

バッファーにローカルの静的を使用します。
このソリューションは初期の C で頻繁に使用され、C ライブラリの多くの関数にまだ存在しています。これには 2 つの大きな欠陥があります。1) 連続して呼び出しを行うと結果が上書きされるため、クライアント コードは関数を再度呼び出す前に独自のコピーを作成する必要があります。2) スレッド セーフではありません。(2 番目の問題は、スレッド ローカル ストレージを使用することで回避できます。) あなたのような場合、バッファがデータに対して十分な大きさでなければならないという問題もあり、おそらく動的割り当てが必要になり、複雑さが増します。
動的に割り当てられたメモリへのポインターを返します。
これは理論的にはうまく機能しますが、クライアント コードでメモリを解放する必要があります。これは厳密に文書化する必要があり、非常にエラーが発生しやすくなります。
クライアント コードでバッファを提供する必要があります。
これはおそらく最新のコードでは最良の解決策ですが、アドレスとバッファーの長さのために追加のパラメーターが必要であることを意味します。

これに加えて、std::ostringstream 連結のみを行っている場合は使用する必要はありません。2 つの文字列を追加するだけです。どのようなソリューションを使用する場合でも、結果が適合することを確認してください。

于 2012-12-19T17:04:38.520 に答える