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();
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 )を参照
数年後に@ 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<>
を使用できない場合)。ただし、これらの他のソリューションはどちらもパフォーマンスが優れています。
私は通常以下の方法を使います。
#include <sstream>
template <typename T>
std::string NumberToString ( T Number )
{
std::ostringstream ss;
ss << Number;
return ss.str();
}
詳しくはこちら こちら 。
おそらく最も一般的な簡単な方法は、 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
を作成するのと同等の定義。
Boostがインストールされている場合(これは推奨されます)
#include <boost/lexical_cast.hpp>
int num = 4;
std::string str = boost::lexical_cast<std::string>(num);
文字列ストリームを使うほうが簡単ではないでしょうか。
#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();
}
純粋なC++では、私が知っていることではありません。しかし、あなたが言ったことを少し修正したもの
string s = string(itoa(a));
動作するはずです、そしてそれはかなり短いです。
sprintf()
はフォーマット変換にかなり良いです。その後、1で行ったように、結果のC文字列をC++文字列に代入できます。
最初に含める:
#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!."
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++フォーマットライブラリの作者です。
数値変換にstringstreamを使うのは危険です。
http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ を参照してください。ここで、operator<<
はフォーマットされた出力を挿入します。
現在のロケールに応じて、3桁を超える整数が4桁の文字列に変換され、余分な桁区切り文字が追加される可能性があります。
たとえば、int = 1000
は文字列1.001
に変換できます。これにより、比較操作がまったく機能しなくなる可能性があります。
だから私は強くstd::to_string
方法を使うことを勧めます。それはより簡単で、あなたが期待することをします。
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つをあなた自身の関数にラップすることさえできますが、これは人気のあるもののいくつかを分析的に見ることを提供します。
文字列をストリームのようにその場で作成できるようにするための構文糖を追加するのはかなり簡単です。
#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;
}
つかいます:
#define convertToString(x) #x
int main()
{
convertToString(42); // Returns const char* equivalent of 42
}
C++ 17は std :: to_chars をより高性能なロケールに依存しない代替として提供します。
私が使う:
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 ++コンパイラで動きます。
それは私のためにこの私のコードのために働いた:
#include <iostream>
using namespace std;
int main()
{
int n=32;
string s=to_string(n);
cout << "string: " + s << endl;
return 0;
}
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)
を使えるようになりました
#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;
}
これはもう一つの簡単な方法です
char str[100] ;
sprintf(str , "%d" , 101 ) ;
string s = str;
sprintfは、データを必要な形式の文字列に挿入するためのよく知られたものです。
3行目に示すように、char * arrayをstringに変換できます。
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;
}
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);
どうしてあなたはできないのか
int a = 10;
string str = a + '0';
CString
を使う:
int a = 10;
CString strA;
strA.Format("%d", a);
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;
}
"純粋な" 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;
}