2017-09-23 5 views
0

でのconstのchar *を取得するI私はconst char *に変換するが必要数(私はそれらを使用しているAPIは、その機能の多くに入力としてconst char *必要です)持っています。次の作品は:変換は::はstd文字列と1行

int num = 5; 
std::string s = std::to_string(5); 
const char * p = s.c_str(); 

how to convert from int to char*?のもののような答えによって示唆されているように、それは一見不必要な変数sを作成する必要が、私は、次の試してみましたが、それはその後、空の文字列に(Pポイントを動作しません。 ):

int num = 5; 
const char * p = std::to_string(num).c_str(); 

これを達成するためのクリーンな方法はありますか?なぜ2番目の例は機能しませんか?

const char * p; 
{ 
    std::string tempStr("hi"); 
    p = tempStr.c_str(); 
    // p points to "hi" string. 
} 
// now p points to "" string. 

私は問題std::to_string(num)がすぐスコープまたは直接何かを初期化するために使用されていないので、似たようなの外に出ることを疑うます:私はこの明白なミスを犯した場合の動作は何が起こるかと非常によく似ています。

+0

理由だけではなく、 'のstd :: STRING'を使用し、'のconstのchar * 'を忘れませんか? ( 'std :: string'は有用なコードでラップされた' char * 'だけなので、必要ありません) – Galik

+0

' '一見不要な' 'インスタンスは、' p'が指し示す動的に割り当てられたメモリを管理します。 2番目の例では、そのメモリはすぐに割り当てが解除され、 'p'にはダングリングポインタが残っています。 3番目の例と同じですが、明示的にもう少し詳しく説明します。 –

+0

@Galikええ、私は大好きですが、私が使用しているAPIは、私がたくさん使う関数の入力としてconst char *を必要としています。 – aquirdturtle

答えて

3

std::stringは(new[]delete[]で作成)を管理する動的メモリをカプセル化します。それを分解しましょう。

const char * p = std::to_string(num).c_str(); 
  1. numの人間可読表現と)std::stringを作成します。
  2. new[]const char*を文字列に割り当てます。
  3. pにその値を割り当てます。
  4. std::stringdelete[]を割り振ってconst char*を破棄します。
  5. pポイントあなたは、へのポインタポイントは、そのポインタの生涯を通じてを存在しなければならないデータをポインタを使用している場合...データ

を割り当て解除します。

文字列のコピーをnew[]以外にはありません。後で明示的にdelete[]にする必要があります。そして、その時点で、あなたはお風呂で赤ちゃんを放り出し、std::stringを使う必要はありません。

少なくとも、内部データを参照するのに必要な長さの文字列を作成します。

0

あなたの価値を保持し、その寿命を管理するために使用できるchar*を返す関数が必要です。 char*が管理していないメモリを指しているため、問題のあるバージョンが壊れています。例えば

std::unique_ptr<char[]> str(int32_t x) 
{ 
    std::unique_ptr<char[]> res(new char[12]); 
    snprintf(res.get(), 12, "%d", x); 
    return res; 
} 
-1

どこでもstd::stringを使用し、Nessecaryでない場合はconst char*を使用しないでください。彼らは基本的に同じことです。私はconst char*を使用するのは、私がファイルパスを使用しているときだけです。 どこでもstd::stringを使用すると、プログラムが機能するはずです。

+3

'using namespace STD'はタイプミスではなく、ヘッダファイル(グローバルスコープ)での使用には不適切です。良い提案ではありません。 –

+0

申し訳ありません、John Sainiさん。私はそれを理解し、それを修正しました。下降票と電気的なコメントをありがとう。 –

3

ちょうどstd::stringを使用してください。あなたが望むすべてと、それを使用しない場合は手作業で行う必要があります。

あなたは、単にこのようstd::string::c_str()を使用const char*機能にconst char*を渡す必要があります:

some_api_function(mystring.c_str()); // passes a const char*