intをstd :: stringに変換する


143

intを文字列に変換する最も簡単な方法、できればインライン化できるものは何ですか?stlとboostを使用した回答は歓迎されます。



63
C ++ 11では次のto_stringように使用できますstd::string s = std::to_string(42)

5
C ++ 11とto_stringが長生きします!:)
オーガスティン2015

回答:


350

C ++ 11ではstd :: to_stringを使用できます

int i = 3;
std::string str = std::to_string(i);

4
std :: to_string()は、MinGWでは機能しません。
Archie、

3
@bparkerなるほど、それはgcc 4.8.0で修正されたと思います。最新のCode :: Blocks(13.12)が付属するMinGWには、gcc 4.7.1がまだあります。
Archie、

47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

36

boost::lexical_cast<std::string>(yourint) から boost/lexical_cast.hpp

std :: ostreamをサポートするすべてのものに対応しますが、たとえば、 itoa

stringstreamやscanfよりも高速に見えます。


15
標準C ++でこれを行う簡単な方法がなかった場合、Boostはあなたの友達です...もちろん私は何をlexical_castもたらすのも好きですが、Boostはこの種のタスクにはかなりやり過ぎだと感じています...
rubenvb

2
やりすぎ?何に基づいていますか?boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/...
Catskul

Boostを使用できない場合は、視聴者を検討する必要があります
Damian

5
「stlおよびboostを使用した回答は歓迎されます。」-対象となる視聴者
コンラッドジョーンズ

30

よく知られている方法は、ストリーム演算子を使用することです。

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

もちろん、テンプレート関数を使用して、あらゆるタイプに一般化できます^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
注:これにはが必要#include <sstream>です。
TechNyquist

@TechNyquist:そ​​の通りです。コンパイル可能という意味ではありませんが、変更されました!
ニューロ2016

1
つまり、コンパイル可能であるという意味ではありませんでしたが、実際にインクルードすると、次のようになります
。– TechNyquist

1
@TechNyquist:はい、いくつかありstd::ます;)
ニューロ

16

std::to_stringC ++ 11から使用できない場合は、cppreference.comで定義されているとおりに記述できます。

std::string to_string( int value ) 符号付き10進整数を、std::sprintf(buf, "%d", value)十分に大きなbufで生成されるものと同じ内容の文字列に変換します。

実装

#include <cstdio>
#include <string>
#include <cassert>

std::string to_string( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}

あなたはそれでより多くを行うことができます。使うだけ"%g"変換フロートや文字列にダブル、使用する"%x"16進表現に変換int型へ、というように。


14

非標準関数ですが、ほとんどの一般的なコンパイラに実装されています:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

更新

C ++ 11はいくつかのstd::to_stringオーバーロードを導入しました(デフォルトはbase-10であることに注意してください)。


3
@DevSolar:詳しく説明する必要があります。ブーストの例はすでに与えられていました。このソリューションは、boostがインストールされていない場合、またはほとんどのコンパイラーで使用できます(または、要件により、何らかの理由で使用することが禁止されています)。ostream作品だけでなく、あなたが2進数、8進数、またはHEX形式(例えばベース-32)以外のものとして数文字列を保存するために必要になるまで。
ザックハウランド2011年

3
非標準の機能が好きなとき、私はそれ好きではないitoa()stricmp()に対する答えとして与えられているもの
DevSolar 2011年

6
あなたの感性を怒らせて申し訳ありませんが、私はそれが最初の文の非標準関数であったと述べました。私はそれについて言及しませんでしたsprintfが、OPの目標を達成することもできます(ただし、共通の基本数以外が必要な場合でも柔軟性に欠けるという欠点があります)。
ザックハウランド

1
はい、あなたはそれを述べました、そして私がそうするように私がそうするのがむずかしいときでさえ、私はあなたの答えに反対票を投じませんでした。だから私たちは平等だと思います。;-)
DevSolar '12年

8

次のマクロは、使い捨てほどコンパクトではないostringstream、またはboost::lexical_cast

ただし、コード内で文字列への変換を繰り返し行う必要がある場合、このマクロは、文字列ストリームを直接処理したり、毎回明示的にキャストしたりするよりも、使い勝手が優れています。

それはまたによってサポートされるすべてを変換するので、それは非常に用途が広いですoperator<<()、でを組み合わせです。

定義:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

説明:

std::dec匿名を作るために副作用のない方法であるostringstreamジェネリックにostreamそうoperator<<()機能検索がすべてのタイプのために正しく動作します。(それ以外の場合、最初の引数がポインター型の場合、問題が発生します。)

dynamic_castタイプのバックを返すostringstreamに呼び出すことができるので、str()それをし。

使用する:

#include <string>

int main()
{
    int i = 42;
    std::string s1 = SSTR( i );

    int x = 23;
    std::string s2 = SSTR( "i: " << i << ", x: " << x );
    return 0;
}

1
@rubenvb:あなたは、テンプレートにこれを有効にする方法を教えて、私は私はこの構文を使用してきたすべてのC ++のプロジェクトを更新します。
DevSolar

@rubenvb:すみません、それは本来あるべきほど明確ではなかったです。(C ++ 98を使用して)出力をデイジーチェーン接続する機能を失うことなく(2つ目の例のように)、これをテンプレートに変換する方法、または処理するために複雑な混乱を考え出す方法がわかりません任意の数のパラメータとパラメータタイプ。
DevSolar 2011年

@DevSolar:しませinline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }んか?(持ってテストしたが、私は間違って行くと、なぜだろうか不思議ない?
rubenvb

@rubenvb:個人用ですint(私の最初の例)。しかしなしostreamでコンパイラに見えるmain(それはテンプレート関数の中に隠されているように)、それは、ルックアップしようとするoperator<<()ためにconst char []、私の第二の例では- croakしています。OPがを要求するだけであることは知ってintいますが、このより一般的なマクロは非常に有用であり(実際にはかなり広まっています)、ここに含めようと思いました。
DevSolar 2011年

汎用性のために、私はテンプレート関数を好みます。デイジーチェーンの場合は、おそらく同じ関数で少しのRTTIを使用して処理できます...
ニューロ

2

あなたは、変換するには、この機能を使用することができますintstd::string含めた後<sstream>

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}

0

プロジェクトにitoaの実装を含めることができます。
これは、std :: stringで動作するように変更されたitoaです。http://www.strudel.org.uk/itoa/


-2
#include <string>
#include <stdlib.h>

ここでは、intを文字列に変換する別の簡単な方法です

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

その他の方法については、このリンクに アクセスしてくださいhttps://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/


このメソッドヘッダーファイルを使用するには、以下を含める必要があります。#include <string> #include <stdlib.h>
Vipul Dungranee

-3

私が持っているとしましょうinteger = 0123456789101112。さて、この整数は、stringstreamクラス。

C ++のコードは次のとおりです。

   #include <bits/stdc++.h>
   using namespace std;
   int main()
   {
      int n,i;
      string s;
      stringstream st;
      for(i=0;i<=12;i++)
      {
        st<<i;
      }
      s=st.str();
      cout<<s<<endl;
      return 0;

    }

似ていませんでしたが、何年も前にすでにより完全な答えが出ましたか?
Walter

ええ、でもこの答えは完璧です。以前の効果的な答えは得られなかったので。
Shawon、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.