0

これを行うことは可能ですか

std::string str(const char* s)
{  
     return std::string(s);
} 

int main() {  
    char* strz = (char*)str("asd").c_str();  
}  

それ以外の:

int main(){  
    std::string temp = str("asd");  
    char* strz = (char*)temp.c_str();  
}

私はそれがconst char* strz必要であることを知っていますが、コードブロック内でのみ必要です(新規/削除なし)。メソッドから文字列を返した後、参照を探し(見つからない場合は文字列を削除します)、次に を呼び出しますc_str()。私は(私とは無関係に)多くの文字を持っており、2番目のソリューションを使用できますが、コードが多すぎます。

4

3 に答える 3

6

2番目のオプションを使用する場合-

std::string temp = str("asd");
char* strz = (char*)temp.c_str();

未定義の動作に遭遇している可能性があります。の内容を変更することは違法ですstrzstrcpyの可変配列を取得するには、を使用する必要がありますcharstringのコンストラクターを直接使用できるため、最初の方が優れているわけではありません。さらに、冗長です。

とにかく、から取得するにchar*は、次のstringことができます。

char* get(const std::string& str)
{
   char* ret = new char[str.length() + 1]();
   strcpy(ret,str.c_str());
   return ret;
}

あなたがdelete[]それを終えたとき、あなたはあなた自身を記憶しなければならないでしょう。

于 2012-04-22T17:02:38.947 に答える
1

あなたが聞きたいことを推測して答えさせてください:)私が間違って推測した場合は無視してください:)

したがって、次を返す関数がありますstd::string

std::string str(...);

そして、使用する古いコードがありますchar*(文字列を変更しなくても、引数をとして宣言しないほど古いconst char*)。これを結果とともに使用します。

int ugly_func1(char*) {...}
int ugly_func2(char*) {...}
int ugly_func3(char*) {...}

int main()
{
    std::string temp = str(...);
    char* temp1 = (char*)temp.c_str();
    ugly_func1(temp1);
    ugly_func2(temp1);
    ugly_func3(temp1);
}

したがって、いいえ、一時変数で構文を使用する必要があります。あなたはこれを書くことはできません:

int main()
{
    char* temp = (char*)str(...).c_str();
    ugly_func1(temp);
    ugly_func2(temp);
    ugly_func3(temp);
}

str()これは不正なコードです(たとえば、呼び出す前にの戻り値を破棄しugly_func1ます)。厄介なことは、それが時々機能しているように見えるかもしれないということです。

于 2012-04-22T17:24:36.740 に答える
1

const char* から char* へのキャスト以外にも問題があります

char* strz = (char*)str("asd").c_str();

これにより、この行の最後で破棄される一時的な std::string が作成されます。そして、それは char* strz を無効にします。

一時的なものとして扱うのではなく、返された std::string を保持する必要があるように思えます。

std::string strz = str("asd");
...
foo(strz.data()); // use strz
于 2012-04-22T17:13:45.237 に答える