intを文字列に変換する最も簡単な方法、できればインライン化できるものは何ですか?stlとboostを使用した回答は歓迎されます。
to_string
ように使用できますstd::string s = std::to_string(42)
intを文字列に変換する最も簡単な方法、できればインライン化できるものは何ですか?stlとboostを使用した回答は歓迎されます。
to_string
ように使用できますstd::string s = std::to_string(42)
回答:
C ++ 11ではstd :: to_stringを使用できます
int i = 3;
std::string str = std::to_string(i);
boost::lexical_cast<std::string>(yourint)
から boost/lexical_cast.hpp
std :: ostreamをサポートするすべてのものに対応しますが、たとえば、 itoa
stringstreamやscanfよりも高速に見えます。
lexical_cast
もたらすのも好きですが、Boostはこの種のタスクにはかなりやり過ぎだと感じています...
よく知られている方法は、ストリーム演算子を使用することです。
#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();
}
#include <sstream>
です。
std::
ます;)
std::to_string
C ++ 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型へ、というように。
非標準関数ですが、ほとんどの一般的なコンパイラに実装されています:
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であることに注意してください)。
ostream
作品だけでなく、あなたが2進数、8進数、またはHEX形式(例えばベース-32)以外のものとして数文字列を保存するために必要になるまで。
itoa()
かstricmp()
に対する答えとして与えられているもの。
sprintf
が、OPの目標を達成することもできます(ただし、共通の基本数以外が必要な場合でも柔軟性に欠けるという欠点があります)。
次のマクロは、使い捨てほどコンパクトではない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;
}
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
んか?(持ってテストしたが、私は間違って行くと、なぜだろうか不思議ない?
int
(私の最初の例)。しかしなしostream
でコンパイラに見えるmain
(それはテンプレート関数の中に隠されているように)、それは、ルックアップしようとするoperator<<()
ためにconst char []
、私の第二の例では- croakしています。OPがを要求するだけであることは知ってint
いますが、このより一般的なマクロは非常に有用であり(実際にはかなり広まっています)、ここに含めようと思いました。
#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/
私が持っているとしましょう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;
}