2009-06-03 10 views
42

longをC++のstringに変換するにはどうすればよいですか?longをC++の文字列に変換するにはどうすればよいですか?

+5

だけビットでstd::to_stringを使用することができます...私は、この "キャスト" 呼び出すことはありません。 – kbyrd

+1

@krbyrdなぜか教えてくれますか?私は.NETist自身ですが、C++はまだ私にとって不快感を感じています。 :) –

+4

同意すると、これは変換であり、キャストではありません。 – ralphtheninja

答えて

49

stringstreamを使用できます。

#include <sstream> 

// ... 
std::string number; 
std::stringstream strstream; 
strstream << 1L; 
strstream >> number; 

コンパイラの標準ライブラリには、通常、独自のC関数があります。私はより多くの "ポータブルな"変種を好む。

これを行うにはsprintfを使用しますが、これはあまり安全ではありません。いくつかのライブラリには、sprintf_sのようなバッファオーバーランから保護する新しいバージョンがあります。

1

チェックアウトstd::stringstream

3
#include <sstream> 


    .... 

    std::stringstream ss; 
    ss << a_long_int; // or any other type 
    std::string result=ss.str(); // use .str() to get a string back 
+1

これはstd :: stringではなく、std :: stringです。 – avakar

+0

ありがとうございます - 指のトラブル。 –

-1

私は通常sprintfを使用しています。

char buf[5] = {0}; // one extra byte for null  
sprintf(buf, "%l", var_for_long); 
+1

-1。 C++コンパイラはコードをコンパイルしますが、確かにC++と呼ばれるべきではありません。さらに、私は5文字で十分だろうと思う。 – avakar

+1

この日にsprintfを推奨しないでください。バッファオーバーランエクスプロイトが十分ではありませんか?このコードに書かれているように見えるわけではありませんが、物事がどのように変化するかはわかりません。 – philsquared

+1

フィル、バッファは10000以上の任意の数でオーバーフローします。 – avakar

8
int main() 
{ 
    long mylong = 123456789; 
    string mystring; 
    stringstream mystream; 
    mystream << mylong; 
    mystring = mystream.str(); 
    cout << mystring << "\n"; 
    return 0; 
} 
4

いくつかの方法があります。だから、長い間、あなたは32ビットアーキテクチャ上にあると仮定して、次の操作を行う可能性があるため。詳しくはThe String Formatters of Manor Farmを読んでください。

+0

それは良い記事です。 – Skurmedel

+1

はい。これは少なくとも私がそれをリンクした3回目です。 8v) –

22

さてあなたは、コピー&ペーストのファンであれば、ここにある:

#include <sstream> 

template <class T> 
inline std::string to_string (const T& t) 
{ 
    std::stringstream ss; 
    ss << t; 
    return ss.str(); 
} 
+0

あなたは 'テンプレート'を見逃しました。 – avakar

+0

ありがとう、私は答えを更新しました。 –

+0

'inline'が冗長になりました。 – avakar

7

私はこれは宿題の種類を知りませんが、おそらく先生があなたの答えを望んでいません単に "魔法の"既存の関数を呼び出すことが推奨されますが、自分で実装することができるかどうかを確認したいと考えています。

私の先生は、「あなたがシステムで見つけられるのではなく、あなた自身でプログラムできるかどうかを見たい」と言っていました。まあ、彼はどのように間違っていた;)...

とにかく、あなたの先生はここに、同じであることを行うには、ハードな方法であれば...

std::string LongToString(long value) { std::string output; std::string sign; if(value < 0) { sign + "-"; value = -value; } while(output.empty() || (value > 0)) { output.push_front(value % 10 + '0') value /= 10; } return sign + output; } 

あなたがstd::stringを使用していないと主張している可能性があり"難しい道"、しかし、私は実際のアゴリズムに何が含まれるかを推測します。ここ

+0

今度は、準備ができた機能を使用するのがいいです。しかし、このきちんとした考えに感謝します。 –

+0

本当ですか?彼はちょうどあなたがどこかの関数を見つけることができるかどうかをチェックしていますか?ええ、時間は変わった;).. – beef2k

+0

@ beef2kさらに良い - 彼は私がOOPを知っていることに気づいて感動し、何かをチェックしない。 :) –

1

一つ、あなたが問題をさらに考えるのに役立つが、それは文字列に時間がかかりキャストされる必要があるときにどのような形式です。

(Calc/Excelのような)スプレッドシートプログラムをご覧ください。それが陰性であれば角括弧をつけて、常に符号を表示してください。実際に番号が他のものを表していますか?代わりに、それをOractalまたはHexで表示してください。

これまでの回答からは、デフォルトの出力が得られましたが、正しい出力が得られなかった可能性があります。

+0

私がそれを必要とするなら、私は私の質問を編集するでしょう。 :) –

+0

それを愛し、私は問題に考えられた答えを与えて、宿題についての考えを助けるために、既にそこにあった答えを与えずに、私がdownvoteを得て、一方で 'std :: stringstream'がupvoteを持っている... –

41

C++ 11では、実際には文字列>にstd :: to_string関数とstd :: to_wstring関数があります。

string to_string(int val); 
string to_string(long val); 
string to_string(long long val); 
string to_string(unsigned val); 
string to_string(unsigned long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string (long double val); 
1

あなたはつべこべのC++ 11

long val = 12345; 
std::string my_val = std::to_string(val); 
関連する問題