web-dev-qa-db-ja.com

C++でintを文字列に変換する最も簡単な方法

C++でintから同等のstringに変換する最も簡単な方法は何ですか。私は二つの方法を知っています。もっと簡単な方法はありますか?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
1332
Nemo

C++ 11では、 std::stoi (および各数値型の派生型)および std::to_string が導入されていますが、これらはC atoiおよびitoaに相当しますが、std::stringで表します。

#include <string> 

std::string s = std::to_string(42);

したがって、私が考えることができる最短の方法です。 autoキーワードを使用して、型の命名を省略することもできます。

auto s = std::to_string(42);

注: [string.conversions] 21.5 in - n3242 )を参照

1782
Matthieu M.

数年後に@ v.oddouとの話し合いを受けて、C++ 17はついに独自のマクロベースの型にとらわれない解決策(下に保存)なしを実行する方法を提供しました。

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

使用法:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

元の答え:

"文字列への変換"は繰り返し発生する問題であるため、私は常に SSTR() マクロをC++ソースの中央ヘッダに定義します。

#include <sstream>

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

使い方はできるだけ簡単です。

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

上記はC++ 98と互換性があり(C++ 11のstd::to_stringを使用できない場合)、サードパーティのインクルードを必要としません(Boost lexical_cast<>を使用できない場合)。ただし、これらの他のソリューションはどちらもパフォーマンスが優れています。

179
DevSolar

私は通常以下の方法を使います。

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

詳しくはこちら こちら

102
Rasoul

おそらく最も一般的な簡単な方法は、 Boost のテンプレートのように、基本的に2番目の選択をlexical_castという名前のテンプレートにラップするため、コードは次のようになります。

int a = 10;
string s = lexical_cast<string>(a);

これの1つの素晴らしさは、それが他のキャストも同様にサポートするということである(例えば、反対方向でも同様に働く)。

また、Boost lexical_castは単に文字列ストリームに書き込んでからストリームから抽出することから始めましたが、現在はいくつか追加されています。まず第一に、かなり少数のタイプのための特殊化が追加されたので、多くの一般的なタイプのために、それは文字列ストリームを使うよりかなり速いです。次に、結果をチェックするようになりました。たとえば、文字列からintに変換した場合、文字列にintに変換できないものが含まれていると例外がスローされます(1234は成功しますが、 123abcはスローします。

C++ 11以降、整数型用にオーバーロードされたstd::to_string関数があるため、次のようなコードを使用できます。

int a = 20;
std::string s = to_string(a);

標準では、これらをsprintfを使用して(指定されたオブジェクトの種類に一致する変換指定子(intには%dなど)を使用して)十分なサイズのバッファーに変換してから、そのバッファーの内容のstd::stringを作成するのと同等の定義。

85
Jerry Coffin

Boostがインストールされている場合(これは推奨されます)

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);
41
Kevin

文字列ストリームを使うほうが簡単ではないでしょうか。

#include <sstream>

int x=42;            //The integer
string str;          //The string
ostringstream temp;  //temp as in temporary
temp<<x;
str=temp.str();      //str is temp as string

あるいは関数を作る:

#include <sstream>

string IntToString (int a)
{
    ostringstream temp;
    temp<<a;
    return temp.str();
}
28
user2287915

純粋なC++では、私が知っていることではありません。しかし、あなたが言ったことを少し修正したもの

string s = string(itoa(a));

動作するはずです、そしてそれはかなり短いです。

19
Mehrdad

sprintf()はフォーマット変換にかなり良いです。その後、1で行ったように、結果のC文字列をC++文字列に代入できます。

16
Throwback1986

最初に含める:

#include <string>
#include <sstream>

次にメソッドを追加します。

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

このような方法を使用してください。

NumberToString(69);

または

int x = 69;
string vStr = NumberToString(x) + " Hello Word!."
12
Alex

C++ 11で利用可能なstd::to_stringは、 Matthieu Mの提案に従って使用できます。

std::to_string(42);

あるいは、パフォーマンスが重要な場合(たとえば、多くの変換を行う場合)、 C++ Format ライブラリのfmt::FormatIntを使用して整数をstd::stringに変換できます。

fmt::FormatInt(42).str();

またはCの文字列:

fmt::FormatInt f(42);
f.c_str();

後者は動的なメモリ割り当てを一切行わず、Boost Karmaベンチマークのstd::to_stringよりも10倍以上高速です。詳細についてはC++での高速整数から文字列への変換を参照してください.

std::to_stringとは異なり、fmt::FormatIntはC++ 11を必要とせず、あらゆるC++コンパイラで動作します。

免責事項:私はC++フォーマットライブラリの作者です。

10
vitaut

数値変換にstringstreamを使うのは危険です。

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ を参照してください。ここで、operator<<はフォーマットされた出力を挿入します。

現在のロケールに応じて、3桁を超える整数が4桁の文字列に変換され、余分な桁区切り文字が追加される可能性があります。

たとえば、int = 1000は文字列1.001に変換できます。これにより、比較操作がまったく機能しなくなる可能性があります。

だから私は強くstd::to_string方法を使うことを勧めます。それはより簡単で、あなたが期待することをします。

8
YesThatIsMyName

C++ 98の場合 には、いくつかのオプションがあります。

boost/lexical_cast

BoostはC++ライブラリの一部ではありませんが、多くの便利なライブラリ拡張が含まれています。

lexical_cast関数テンプレートは、テキストとして表現されるときに任意の型との間での一般的な変換をサポートするための便利で一貫した形式を提供します。 
- ブーストの文書

#include "boost/lexical_cast.hpp"
#include <string>

int main() {
    int x = 5;
    std::string x_str = boost::lexical_cast<std::string>(x);
    return 0;
}

ランタイムに関しては、最初の変換でlexical_cast操作は(私のマシンでは)約80マイクロ秒かかり、その後冗長に行われた場合はその後かなりスピードアップします。


itoa

この関数はANSI-Cでは定義されておらず、C++の一部でもありませんが、一部のコンパイラではサポートされています。 
- cplusplus.com

これは、gcc/g++itoaを使ってコードをコンパイルすることができないことを意味します。

#include <stdlib.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    x_str = itoa(x, x_str, 10); // base 10
    return 0;
}

レポートするランタイムがありません。私はVisual Studioをインストールしていません。これは 報告によるとitoaをコンパイルできます。


sprintf

sprintfは、Cの文字列を処理するCの標準ライブラリ関数であり、完全に有効な選択肢です。

Formatがprintfで使用された場合に印刷されるのと同じテキストで文字列を作成しますが、印刷されるのではなく、コンテンツはstrが指すバッファにC文字列として格納されます。 
- cplusplus.com

#include <stdio.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    int chars_written = sprintf(x_str, "%d", x);
    return 0;
}

stdio.hヘッダーは必要ないかもしれません。ランタイムに関しては、sprintf操作は最初の変換で(私のマシン上で)約40マイクロ秒かかり、その後冗長に行われた場合はその後かなりスピードアップします。


stringstream

これは、C++ライブラリの整数から文字列への変換、およびその逆の主な方法です。 stringstreamのように、ストリームの使用目的をさらに制限するostringstreamに似た姉妹関数があります。 ostringstreamを使用すると、特に<<演算子を使用することだけを意図していることがコードの読者に明確にわかります。この関数は、整数を文字列に変換するために特に必要なものすべてです。より複雑な議論については この質問 を参照してください。

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

実行時に関しては、ostringstream操作は(私のマシンでは)約71マイクロ秒かかり、その後冗長に行われるとかなり速くなりますが、 前の関数ほどではありません


もちろん他の選択肢もありますし、これらのうちの1つをあなた自身の関数にラップすることさえできますが、これは人気のあるもののいくつかを分析的に見ることを提供します。

8
Josh Detwiler

文字列をストリームのようにその場で作成できるようにするための構文糖を追加するのはかなり簡単です。

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

(演算子<< (std::ostream& ..)が定義されていれば)あなたが望むものをstrmake()に追加し、std::stringの代わりにそれを使うことができます。

例:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}
3

つかいます:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}
2
maverick9888

C++ 17は std :: to_chars をより高性能なロケールに依存しない代替として提供します。

2
user10133158

私が使う:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>( &(ostringstream() << myint) )->str();
string myLD_str = static_cast<ostringstream*>( &(ostringstream() << myLD) )->str();

それは私のwindowsとlinux g ++コンパイラで動きます。 

1
J_C

それは私のためにこの私のコードのために働いた:

#include <iostream>
using namespace std;

int main()
{
    int n=32;
    string s=to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}
1
namespace std
{
    inline string to_string(int _Val)
    {   // convert long long to string
        char _Buf[2 * _MAX_INT_Dig];
        snprintf(_Buf, "%d", _Val);
        return (string(_Buf));
    }
}

to_string(5)を使えるようになりました

1
user1363411
#include "stdafx.h"
#include<iostream>
#include<string>
#include<string.h>


std::string intToString(int num);

int main()
{

    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;


    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;

    while (num)
    {
        char toInsert = (num % 10) + 48;
        numAsStr.insert(0, 1, toInsert);

        num /= 10;
    }

    return numAsStr;
}
1
Tayyab Mazhar

これはもう一つの簡単な方法です 

char str[100] ; 
sprintf(str , "%d" , 101 ) ;  
string s = str; 

sprintfは、データを必要な形式の文字列に挿入するためのよく知られたものです。

3行目に示すように、char * arrayをstringに変換できます。

1
Natesh bhat
string number_to_string(int x){
    if(!x) return "0";
        string s,s2;
        while(x){
            s.Push_back(x%10 + '0');
            x/=10;
        }
    reverse(s.begin(),s.end());
    return s;
}
1
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);
0
user2047065

どうしてあなたはできないのか

int a = 10;
string str = a + '0';
0
Ver Nick

CStringを使う:

int a = 10;
CString strA;
strA.Format("%d", a);
0
Tur1ng

Stringstreamを使うのはとても簡単です。

 string toString(int n)
 {
   stringstream ss(n);
   ss << n;
   return ss.str();
 }

 int main()
 {
    int n;
    cin>>n;
    cout<<toString(n)<<endl;
    return 0;
 }
0
rashedcs

"純粋な" C++を使う(C++ 11などではない)

#include <bits/stdc++.h>

using namespace std;

string to_str(int x) {
    ostringstream ss;
    ss << x;
    return ss.str();
}

int main()
{
    int number = 10;
    string s = to_str(number);
    cout << s << endl;
    return 0;
}
0
Nelio Alves