2012-04-22 18 views
0

を返すことは、このC++文字列

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()を呼び出します。私は多くのchar(私から独立)を持っていて、私は2番目のソリューションを使うことができましたが、コードが多すぎます。

+0

4つのスペースにコードをインデントの代わりに、インラインコードの構文( '' '\' \)を使用してコードとすべての単一の行をマークしてください! –

+0

、すなわちすべてをハイライトしてCtrl-Kを押すか、コードフォーマットボタンを押してください – chris

+0

あなたの 'str'関数は不必要です。あなたはコードを短縮するだけですか? –

答えて

6

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

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

あなたはおそらく未定義の動作に実行しています。 strzの内容を変更することは違法です。 charの可変配列を取得するには、strcpyを使用する必要があります。 stringのコンストラクタを直接使用することができるので、最初の方が良いとは言えません。また、重複しています。とにかく

は、あなたが行うことができます stringから char*を取得する:あなたはそれで終わったら

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

あなたはdelete[]メモリ自分自身にあります。

+0

このキャストを一時的に(書き込み可能でなくても)使用し、後でコピーします(ただしchar *からコピーします)。 – user1112008

+2

@ user1112008書き込み可能でない場合、なぜ 'const char *'を持たないのでしょうか? –

+0

私はそれが私から独立していると言いました:(私は "私の側"にそれを保持する構造を編集することができましたが、 "相手側"では 'char *'として読み込まれます。 )。 – user1112008

1

*

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

これは、この行の末尾に破壊され、一時はstd ::文字列を作成するcharへのconst char型でも*からキャストを超えた問題があります。そしてそれはchar * strzを無効にします。

あなただけ返されるのstd ::文字列への保持ではなく、一時的としてそれを治療する必要があるようですが、私に聞こえる

std::string strz = str("asd"); 
... 
foo(strz.data()); // use strz 
1

は私はあなたが尋ねると、それに答えるために何を望むかを推測してみましょう:)

std::string str(...); 

そして、あなたはを使用して、いくつかの古いコードを持っている:私は間違って推測している場合:)

をですから、std::stringを返すいくつかの機能を持って無視して自由に感じます

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); 
} 

だから、いや、あなたが使用する必要があります:あなたは結果で使用したい、(それも、それは文字列を変更していなくても、const char*としてその引数を宣言しないように、古いです) temp変数を持つ構文。あなたはこれを書くことはできません。

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

これは、不正なコード(例えば、その上にugly_func1を呼び出す前にstr()の戻り値を破壊する)です。厄介なことは、時々動作するように見えることです。