Apa adalah cara termudah untuk mengkonversi dari int
setara string
dalam C++. Saya sadar dari dua metode. Apakah ada cara yang lebih mudah?
(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 memperkenalkan std::stoi
(dan varian untuk masing-masing tipe numerik) dan std::to_string
, rekan-rekan dari C atoi
dan itoa
tetapi dinyatakan dalam istilah std::string
.
#include <string>
std::string s = std::to_string(42);
karena itu adalah jalan terpendek yang dapat saya pikirkan. Anda bahkan dapat menghilangkan penamaan jenis, menggunakan auto
kata kunci:
auto s = std::to_string(42);
Catatan: lihat [string.konversi] (21.5 di n3242)
Mengambil sebuah diskusi dengan @v. oddou beberapa tahun kemudian, C++17 akhirnya telah disampaikan cara untuk melakukan awalnya makro-berdasarkan jenis-agnostik solusi (diawetkan di bawah) without akan melalui macro uglyness.
// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
std::ostringstream sstr;
// fold expression
( sstr << std::dec << ... << args );
return sstr.str();
}
Penggunaan:
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 ) );
Jawaban asli:
Sejak "konversi ... untuk string" adalah masalah yang berulang, saya selalu menentukan SSTR() macro di tengah header saya C++ sumber:
#include <sstream>
#define SSTR( x ) static_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
Penggunaan lebih mudah karena bisa:
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 ) );
Di atas adalah C++98 kompatibel (jika anda tidak dapat menggunakan C++11 std::to_string
), dan tidak membutuhkan pihak ketiga termasuk (jika anda tidak menggunakan Boost lexical_cast<>
); kedua solusi lain memiliki kinerja yang lebih baik meskipun.
Mungkin yang paling umum dan mudah cara membungkus pada dasarnya pilihan kedua anda ke dalam template yang bernama lexical_cast
, seperti yang ada di Meningkatkan, sehingga kode anda terlihat seperti ini:
int a = 10;
string s = lexical_cast<string>(a);
Satu kerapian dari ini adalah bahwa hal itu mendukung gips lainnya juga (misalnya, dalam arah yang berlawanan bekerja sama dengan baik).
Juga dicatat bahwa meskipun Dorongan lexical_cast dimulai sebagai hanya menulis untuk stringstream, maka penggalian kembali keluar dari sungai, sekarang memiliki beberapa penambahan. Pertama-tama, spesialisasi untuk beberapa jenis telah ditambahkan, sehingga untuk banyak jenis umum, it's jauh lebih cepat daripada menggunakan stringstream. Kedua, sekarang cek hasilnya, sehingga (misalnya) jika anda mengubah dari string ke sebuah int
, itu bisa melempar pengecualian jika string mengandung sesuatu yang tidak't diubah menjadi sebuah int
(misalnya, 1234
akan berhasil, tetapi 123abc
akan melempar).
Sebagai C++11, ada's std::to_string
fungsi kelebihan beban untuk tipe integer, sehingga anda dapat menggunakan kode seperti:
int a = 20;
std::string s = to_string(a);
Standar mendefinisikan ini sebagai setara dengan melakukan konversi dengan sprintf
(menggunakan conversion specifier yang cocok dengan disediakan jenis objek, seperti %d
untuk int
), ke sebuah buffer dengan ukuran yang cukup, kemudian menciptakan sebuah std::string
dari isi dari buffer.
Akan lebih mudah menggunakan stringstreams:
#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
Atau membuat sebuah fungsi:
#include <sstream>
string IntToString(int a)
{
ostringstream temp;
temp << a;
return temp.str();
}
Anda dapat menggunakan std::to_string
yang tersedia pada C++11 sebagai disarankan oleh Matthieu M.:
std::to_string(42);
Atau, jika kinerja adalah penting (misalnya, jika anda melakukan banyak konversi), anda dapat menggunakan fmt::format_int
dari {fmt} perpustakaan untuk mengkonversi bilangan bulat ke std::string
:
fmt::format_int(42).str();
Atau C string:
fmt::format_int f(42);
f.c_str();
Yang terakhir doesn't melakukan alokasi memori dinamis dan lebih dari 10 kali lebih cepat dari std::to_string
pada Meningkatkan Karma tolok ukur. Melihat Fast integer untuk konversi string dalam C++ untuk rincian lebih lanjut.
Catatan yang kedua adalah thread-safe.
Tidak seperti std::to_string
, fmt::format_int
doesn't membutuhkan C++11 dan bekerja dengan C++ compiler.
Disclaimer: saya'm penulis {fmt} perpustakaan.
Pertama meliputi:
#include <string>
#include <sstream>
Kedua tambahkan metode:
template <typename T>
string NumberToString(T pNumber)
{
ostringstream oOStrStream;
oOStrStream << pNumber;
return oOStrStream.str();
}
Menggunakan metode seperti ini:
NumberToString(69);
atau
int x = 69;
string vStr = NumberToString(x) + " Hello word!."
Menggunakan stringstream nomor konversi berbahaya!
Lihat http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ di mana ia mengatakan bahwa operator<<
sisipan diformat output.
Tergantung pada lokal anda saat ini integer lebih besar dari 3 angka, bisa di convert ke string dari 4 digit, menambahkan ekstra pemisah ribuan.
E. g., int = 1000
bisa convertet untuk string 1.001
. Ini bisa membuat perbandingan operasi tidak bekerja di semua.
Jadi saya akan sangat menyarankan menggunakan std::to_string
cara. Hal ini lebih mudah dan tidak apa yang anda harapkan.
Diperbarui (lihat komentar di bawah):
C++17 menyediakan std::to_chars sebagai kinerja yang lebih tinggi lokal independen alternatif
Untuk C++98, ada's beberapa pilihan:
boost/lexical_cast
Boost adalah bukan bagian dari C++ perpustakaan, tapi mengandung banyak berguna perpustakaan ekstensi.
lexical_cast
fungsi template menawarkan sebuah nyaman dan bentuk yang konsisten untuk mendukung konversi umum ke dan dari sewenang-wenang jenis ketika mereka diwakili sebagai teks.
-- Boost's Dokumentasi
#include "boost/lexical_cast.hpp"
#include <string>
int main() {
int x = 5;
std::string x_str = boost::lexical_cast<std::string>(x);
return 0;
}
Adapun runtime, lexical_cast
operasi membutuhkan waktu sekitar 80 mikrodetik (di komputer saya) pada konversi pertama, dan kemudian kecepatan hingga jauh setelah itu jika dilakukan secara berlebihan.
itoa
fungsi Ini tidak didefinisikan dalam ANSI-C dan bukan bagian dari C++, tetapi didukung oleh beberapa kompiler.
-- cplusplus.com
Ini berarti bahwa gcc
/g++
tidak bisa mengkompilasi kode menggunakan 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;
}
Tidak ada runtime untuk laporan. Saya don't memiliki Visual Studio diinstal, yang dilaporkan mampu menyusun itoa
.
sprintf
sprintf
adalah C standard library function yang bekerja pada C string, dan adalah sah alternatif.
Menyusun sebuah string dengan teks yang sama yang akan dicetak jika format yang digunakan pada printf, tapi bukannya dicetak, konten yang disimpan sebagai C string dalam buffer ditunjukkan oleh str.
-- 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;
}
The stdio.h
header mungkin tidak diperlukan. Adapun runtime, sprintf
operasi memakan waktu sekitar 40 mikrodetik (di komputer saya) pada konversi pertama, dan kemudian kecepatan hingga jauh setelah itu jika dilakukan secara berlebihan.
stringstream
Ini adalah C++ library's cara utama untuk mengkonversi bilangan bulat ke string, dan sebaliknya. Ada yang mirip adik fungsi untuk stringstream
yang lebih membatasi penggunaan aliran, seperti ostringstream
. Menggunakan ostringstream
secara khusus memberitahu pembaca kode anda bahwa anda hanya berniat untuk menggunakan <<
operator, pada dasarnya. Fungsi ini adalah semua yang's sangat diperlukan untuk mengkonversi integer ke string. Lihat pertanyaan ini untuk yang lebih rumit diskusi.
#include <sstream>
#include <string>
int main() {
int x = 5;
std::ostringstream stream;
stream << x;
std::string x_str = stream.str();
return 0;
}
Adapun runtime, ostringstream
operasi membutuhkan waktu sekitar 71 mikrodetik (di komputer saya), dan kemudian kecepatan hingga jauh setelah itu jika dilakukan secara berlebihan, tetapi tidak sebanyak sebelumnya fungsi.
Tentu saja ada pilihan lain, dan anda bahkan dapat membungkus satu ini menjadi fungsi sendiri, tapi ini menawarkan sebuah analisis yang terlihat di beberapa tempat yang.
It's lebih mudah untuk menambahkan beberapa sintaksis gula yang memungkinkan seseorang untuk menulis string on the fly di sungai-cara seperti
#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();}
};
Sekarang anda dapat menambahkan apapun yang anda inginkan (dengan ketentuan bahwa operator << (std::ostream& ..)
didefinisikan untuk itu) untuk strmake()
dan menggunakannya di tempat yang std::string
.
Contoh:
#include <iostream>
int main() {
std::string x =
strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
std::cout << x << std::endl;
}
Ini bekerja untuk saya -
Kode saya:
#include <iostream>
using namespace std;
int main()
{
int n = 32;
string s = to_string(n);
cout << "string: " + s << endl;
return 0;
}
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;
}
di Sini's cara lain yang mudah untuk dilakukan
char str[100];
sprintf(str, "%d", 101);
string s = str;
sprintf
adalah terkenal untuk menyisipkan data ke dalam string format yang diperlukan.
Anda dapat mengkonversi char *
array ke string seperti yang ditunjukkan di baris ketiga.
Gunakan:
#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;
}