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


1574

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

(1)

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

(2)

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

4
どちらの方法も良い解決策だと思います。それはあなたがそれを行う必要がある状況に依存します。ファイルの読み取りや書き込みなど、すでにストリームを操作している場合は、2番目の方法が最適です。intを文字列として関数の引数に渡す必要がある場合は、itoaを使用すると簡単です。しかし、ほとんどの場合、intからstringへの変換はファイルを処理するときに発生するため、ストリームが適切です。
Charles Brunet、2011

41
オプション1はどのように機能しますか?itoa()3つのパラメーターを取るのは私の理解です。
b1nary.atr0phy 2013

1
itoaは、同等のストリームよりも高速になります。itoaメソッドで文字列バッファを再利用する方法もあります(文字列を頻繁に生成する場合はヒープ割り当てを回避します。たとえば、数値出力をすばやく更新する場合)。あるいは、カスタムのstreambufを生成して、割り当てオーバーヘッドなどを削減することもできます。そもそもストリームを構築することも、低コストのベンチャーではありません。
ピート

6
@ピート:どちらが速いか心配になったら、stackoverflow.com
Ben Voigt

20
itoa()は標準の一部ではないため、すべてのコンパイラーがサポートしているわけではないため、それを使用するとコードが移植不可能になることに注意してください。Linuxの場合、GCC以外でこの機能をサポートしていないものを使用しているのでない限り、間違いなくアウトです。C ++ 0xを使用している場合は、@ Matthieuが彼の回答で提案したものを使用してください。そうでない場合は、stringstreamを使用してください。stringstreamは十分にサポートされている機能であり、コードはそこにあるすべてのC ++コンパイラと互換性があるはずです。別の方法として、常にsprintf()を使用できます。
rbaleksandar 14年

回答:


2102

C ++ 11を導入しstd::stoi(各数値タイプに変異体)とstd::to_string、Cのカウンターパートatoiitoaの用語に発現されるがstd::string

#include <string> 

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

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

auto s = std::to_string(42);

注:参照[string.conversions] 21.5n3242


199
to_stringメンバーじゃないのstd修正:stackoverflow.com/questions/12975341/...
ベン

36
:またはあなたのコンパイラに依存し、ちょうど右の言語の標準設定g++ -std=c++11 someFile.cc
トーマス・M. DuBuisson

12
@Steve:あるはずです。std1つを除いて、私が知っているすべてのコンパイラーのメンバーです。
Mooing Duck 2013

5
@Matthiew M.提案したものと同じものを使用していますが、このエラーが発生しますError : No instance of overloaded function "std::to_string" matches the argument list 。VS2010c ++を使用しています

19
@Flying:VS2010では、変換する整数を次の型のいずれかに明示的にキャストする必要があります[_Longlong、_ULonglong、long double]; すなわち:string s = to_string((_ULonglong)i);
Zac

184

数年後の@ 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 ) );

元の答え:

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

#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<>)。ただし、これらの他のソリューションはどちらもパフォーマンスが優れています。


2
私はあまり詳しくありませんdynamic_castが、clangを使用してコンパイルしているので、文句を言われます。省略したdynamic_cast場合、問題なくコンパイルされます。dynamic_castこの場合、サービスの目的は何ですか?すでにを作成しているostringstreamので、なぜキャストするのですか?
Mathew、2014年

2
@マシュー:私の回答のリンクは、構成の各部分の詳細な説明につながります。を作成している間ostringstream、それを呼び出しoperator<<()て戻りますostream &- .str()は定義されていません。キャストなしでclangがこれをどのように機能させるのか(または、なぜそれがエラーを生成するのか)本当に疑問に思います。このコンストラクトは多くの場所で公開されており、MSVC、GCC、XLCを含む多くの異なるコンパイラーで10年以上使用してきたので、かなり意地悪に驚いています。
DevSolar 2014年

5
ちょうど好奇心のためにパーティーに来て、反対票を投じました。理由:エレガントではなく、遅いと思われるソリューションに対する投票が多すぎる。1.マクロの使用。私は体系的にどのマクロについても眉をひそめませんが、これは短すぎます。エンドクライアントは、保護されていないマルチラインマクロに対する恐怖に加えて、常に議論の繰り返しを恐れます。(do {} while(0)で保護されていません)2. dynamic_cast。ここでstatic_castが必要なのは、ライブラリが実際に意図したとおりに実装されていることを表明したくない場合だけです。その場合は、代わりにboost :: polymorphic_downcastを使用する必要があります。
v.oddou

2
@ v.oddou:もちろん、批評は自由です。しかし、1。は無効です。マクロは単一のステートメントでdo { } while( 0 )あり、何も追加しません。2.と3.では、おそらくポイントを得ました。これは静的キャストを使用して行うことができ、おそらくそこにあるテンプレートウィザードの1つが「より良い」インターフェイスを思い付くでしょう。しかし、私が言ったように、これは決して私自身の発明ではありません。周りを見て、このマクロ(マクロ!)はいたるところにあります。それ自体がポーラのケースです。私はこれを少し「いじって」より「合理化」するかもしれません。
DevSolar 2015年

1
@ v.oddou:C ++ 17がもたらしたものの中で私が見つけたものを見てください。:-)私はあなたが更新された答えが好きであることを望みます。
DevSolar

109

私は通常、次の方法を使用します。

#include <sstream>

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

詳細はこちら


2
を使用する前にss、それを行う必要がss.clear()あります。この初期化なしでは、予期しない結果が発生しました。
2015年

14
@lifebalance:私はそのような振る舞いを見たことがありません。
Rasoul 2015年

18
@lifebalance:clear()新しく作成したostringstreamオブジェクトは必要ありません。clear()エラー/ EOFフラグをリセットしますが、エラー/ EOF状態はまだ生成されていません。
レミールボー

2
@Rasoulは、NumberToString(23213.123)生成23213.1しながら、std::to_string(23213.123)生産23213.123000がどうなりますか?
Killzone Kid

1
@KillzoneKidこれは、このメソッドがデフォルトの状態で開始している間、std 'ostreamがステートフルであること(これは、10進数の桁数など、以前の状態の変更が保持されることを意味します)です。
xryl669

85

おそらく最も一般的な簡単な方法は、名前のテンプレートに、本質的に、あなたの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 = std::to_string(a);
// or: auto s = std::to_string(a);

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


2
ニース、私はケビンの答えを好むが、彼はインクルードと名前空間を示している。ちょっとした不満。:)しかし、よくできました!
Jason R. Mick

4
これは、C ++ 11のサポートがない場合の方法です。
Alex

40

Boostをインストールしている場合(必要です):

#include <boost/lexical_cast.hpp>

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

4
ブーストインストールに同意しました。多くの場合、文字列をフォーマットすることになると思います。この目的のために、私はboost :: formatを好みます。たとえば、format( "%02d"、number).str()
Werner Erasmus

28

文字列ストリームを使用する方が簡単です。

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

18

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

string s = string(itoa(a));

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


55
itoa()標準機能ではありません!
漫画家

4
@cartoonist:そ​​れは何ですか?
user541686

20
この関数は、ANSI-CおよびC ++では定義されていません。そのため、g ++などの一部のコンパイラではサポートされていません。
漫画家

17

Matthieu Mによって提案されているstd::to_stringように、C ++ 11で使用可能なを使用できます。

std::to_string(42);

パフォーマンスが重要な場合(コンバージョンの多くを行う場合など)や、あなたが使用することができますfmt::format_intから、{} FMTに整数に変換するライブラリstd::string

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

またはC文字列:

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

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

どちらもスレッドセーフであることに注意してください。

とは異なりstd::to_stringfmt::format_intC ++ 11を必要とせず、任意のC ++コンパイラで動作します。

免責事項:私は{fmt}ライブラリの作成者です。


2
スレッドセーフ(再入可能)のままで動的メモリ割り当てを行わないという主張に興味があったので、コードを読みます- c_str()fmt::FormatIntクラス内で宣言されたバッファへのポインタを返します- 返されたポインタは無効になりますセミコロン-stackoverflow.com/questions/4214153/lifetime-of-temporaries
Soren

1
はい、std::string::c_str()(したがって命名)と同じ動作です。完全な式の外でそれを使用したい場合は、オブジェクトを作成し、オブジェクトが破壊される危険なしにFormatInt f(42);使用できますf.c_str()
vitaut 2014年

1
std :: to_string(num)を使用してintからstringに変換しようとすると、奇妙な結果になります。結果を変数に保存し、nが増加するにつれてstringNum [1]またはstringNum [n]のようにアクセスしようとすると、ガベージが発生します。
user8951490

1
これは間違いなくこの質問に対する正しい答えです。ステートフルではない効率的で標準的なコードです。
xryl669

16

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


1
ええ、はい。ただし、Cの文字列を処理する場合、私は通常、snprintf()やそのほかの機能を使用して結果に影響を与えます。
Throwback1986

1
@MatthieuM。あなたのコメントはあなたがそうではないことをさらに証明します。この制限のために出力が切り捨てられた場合、戻り値は、十分なスペースが利用可能であった場合に最終的な文字列に書き込まれたであろう文字数(終端のnullバイトを除く)です。したがって、サイズ以上の戻り値は、出力が切り捨てられたことを意味します。したがってNULL、必要なバッファーサイズを取得するために、サイズを0で呼び出します。
user1095108 2013

2
@ user1095108:snprintfSNPプレフィックスにsprintf注意してください)と(SPプレフィックスに注意してください)を間違えていると思います。前者にサイズを渡すと、オーバーフローしないように注意しますが、後者はバッファのサイズを認識しないため、オーバーフローする可能性があります。
Matthieu M.

1
snprintf最初にバリアントを呼び出し、sprintfその後にバリアントを呼び出すという考え方です。それまでにバッファサイズがわかっているため、呼び出しsprintfは完全に安全になります。
user1095108 2013

1
@ user1095108ああ、そうです。snprintfへの最初のバッファーが不十分である場合、戻り値は何が十分であるかを示します。sprintfとsnprintfの実装を一致させることは不必要に危険であるため、2番目の呼び出しには引き続きsnprintfを使用します。
マブラハム2013年

11

最初に含める:

#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!."

10

数値変換にstringstreamを使用するのは危険です!

がフォーマットされた出力を挿入することを指示するhttp://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/を参照してくださいoperator<<

現在のロケールに応じて、3桁より大きい整数は、4桁の文字列に変換され、余分な桁区切り文字が追加されます。

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

したがって、私はこのstd::to_string方法を使用することを強くお勧めします。それはより簡単で、あなたが期待することをします。

更新(下記のコメントを参照)

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


2
データを交換する必要がある場合、これは深刻な問題であることに同意します。残念ながら、std::to_string現在のロケールも使用します(en.cppreference.com/w/cpp/string/basic_string/to_string、「メモ」セクションを参照)。ほとんどすべての標準ツール(stringstreamsからsprintfsscanfその他)は現在のロケールを使用しています。最近、それが強く当たるまで、私はこれに気づきませんでした。現在、自家製のものを使用しており、作るのは難しくありません。
バートブリル

上記のリンクでは、C ++ 17がより高性能なロケールに依存しない代替手段としてstd :: to_charsを提供していることも述べています。
YesThatIsMyName 2018年

残念ながら、私は次の年にC ++ 11に悩まされています(幸いにも、かなり改善されています)。
バートブリル

1
from_charsとto_charsは完璧ですが、残念ながらwchar_tバリアントを提供していませんでした。
gast128

8

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標準ライブラリ関数であり、完全に有効な代替手段です。

printfでformatが使用された場合に出力されるのと同じテキストで文字列を構成しますが、内容は出力されるのではなく、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など、ストリームの使用目的をさらに制限する同様の姉妹関数がありますostringstreamostringstream特にを使用すると、コードの読者に<<、本質的には演算子のみを使用することを伝えます。この関数は、整数を文字列に変換するために特に必要なすべてです。より複雑な議論については、この質問を参照してください。

#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つを独自の関数にラップすることもできますが、これにより、人気のあるものの分析的な外観が提供されます。


世話をしてくれてありがとう(C ++ 98ユーザー)
A. B

@AB C ++ 98ユーザーが残っているとは信じられません。
コタウスカス

@VladislavToncharov仕事がレガシー機器とコードをサポートすることだけである場合、より新しい業界標準を使用して古いものを熟考します。夏の前、私はPython 2.3でコードを書いていました。
Joshua Detwiler

@JoshuaDetwilerああ、それを忘れてすみません。
コタウカス

4

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


3

ストリームのような方法でオンザフライで文字列を作成できるようにする構文上の砂糖を追加するのはかなり簡単です

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

2

編集。固定桁数の整数を'0'左詰めされたchar *に高速変換する必要がある場合、これはリトルエンディアンアーキテクチャ(すべてのx86、x86_64など)の例です。

2桁の数値を変換する場合:

int32_t s = 0x3030 | (n/10) | (n%10) << 8;

3桁の数値を変換する場合:

int32_t s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

4桁の数値を変換する場合:

int64_t s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

そして、最大7桁の数字まで続きます。この例でnは、与えられた整数です。変換後、その文字列表現には次のようにアクセスできます(char*)&s

std::cout << (char*)&s << std::endl;

注:ビッグエンディアンのバイトオーダーで必要な場合は、テストしていませんが、ここに例を示します。3桁の数値の場合はint32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;4桁の数値(64ビットのアーチ)の場合:機能int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;するはずです。


2
バイトオーダーはどうですか?
shjeff

ポインターのエイリアシングによるこの未定義の動作ではないですか?
dgnuff

1
@shjeffコメントをありがとう、私は答えにエンディアンについてのメモを追加しました。
Alek、

@dgnuffこれを指摘してくれてありがとう、私はこれで問題はありませんでしたが、あなたは正しいです。回答を厳密に変更して、厳密なエイリアシングルールに準拠するようにしました。
Alek、

1

使用する:

#define convertToString(x) #x

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

3
リテラルの数値でのみ機能し、変数の内容は評価しませんが、時には役立ちます。
ウルフ

正しい。しかし、間違いなく便利です
maverick9888

1
リテラル定数の数値を使用してコンパイル時にのみ機能します。OPは可変整数を使用して動的変換を要求すると思います
Ing。ヘラルドサンチェス

0

私が使う:

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 ++コンパイラーで動作します。


0

これは別の簡単な方法です

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

sprintf 必要な形式の文字列にデータを挿入することはよく知られています。

char *3行目に示すように、配列を文字列に変換できます。



0

std::to_string()数値型用に導入されたC ++ 11 :

int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string

4
こんにちは!なぜ、どのようにしてこれが質問への回答を提供するかについての説明を追加できますか?
anothernode

0

使用する:

#include<iostream>
#include<string>

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
n≤0で完全に失敗する
Toby Speight

-1
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
このコードスニペットをありがとうございます。このコードスニペットは、限られた短期間のヘルプを提供する可能性があります。適切な説明は、なぜこれが問題の優れた解決策であるを示すことにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってさらに役立つでしょう。答えを編集して、仮定を含めて説明を追加してください。
Toby Speight

n≤0で完全に失敗
Toby Speight

コメントを追加し、答えを説明し、答え方を読んでください。
Aksen P

-1

MFCを使用している場合は、以下を使用できますCString

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

8
これはMicrosoftのみの拡張機能であることに注意してください
JonnyJD

1
CString :: Format()のアイデアが気に入っています。残念ながらそれは非ポータブルMSのみです。
ニック

1
私は5年後にそれをdownvoted得続けるので、私は..あなたのコメント@JonnyJDからの情報を含めるように私の答えを更新しました
Tur1ng

-2
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);

12
メモリリーク、-1-私から
paulm

これは、バッファオーバーランのようなにおいがします。
コタウカス

-2
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)


10
このソリューションは機能しますが、お勧めしません。アンダースコアと大文字で始まる名前はコンパイラ用に予約されているため、使用しないでください。std名前空間に関数を注入することも、あなたがやるべきことではありません。また、_MAX_INT_DIG標準のマクロのようには見えないため、誤って定義されている場合、このコードは未定義の動作を引き起こす可能性が非常に高くなります。-1
iFreilicht 2014年

6
_MAX_INT_DIGとは何ですか。なぜ2倍になっているのですか。
ポール2015年

-2

使用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;
 }

これは質問で言及されましたが、残念ながら非常に遅いです。
コタウカス

-3

カウンタータイプのアルゴリズムを使用して文字列に変換します。私はこのテクニックをCommodore 64コンピュータのプログラミングから得ました。ゲームのプログラミングにも適しています。

  • 整数を受け取り、10の累乗で重み付けされた各桁を受け取ります。したがって、整数は950であると想定します。

    • 整数が100,000以上の場合、100,000を減算し、["000000"]にある文字列のカウンターを増やします。
      100,000の位置にある数値がなくなるまでそれを続けます。10の別のパワーをドロップします。

    • 整数が10,000以上の場合は、10,000を減算し、["000000"] + 1の位置にある文字列のカウンターを増やします。
      位置10,000の数値がなくなるまでそれを続けます。

  • もう10のパワーを落とす

  • パターンを繰り返す

950は小さすぎて例として使用できないことは知っていますが、理解していただければ幸いです。


コードで例を示すのではなく、アルゴリズムを説明することはあまり役に立ちません。
cdeerinck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.