Boost adalah teman Anda, jika tidak ada cara sederhana untuk melakukan ini di Standard C ++ ... Saya tentu saja suka apa yang lexical_castdibawanya, tetapi merasa Boost cukup banyak kerja keras untuk tugas semacam ini ...
@ TechNyquist: Anda benar. Tidak dimaksudkan untuk dikompilasi, tetapi diubah!
neuro
1
Jadi, Anda tidak bermaksud agar dapat dikompilasi, tetapi sebenarnya dengan menyertakannya :)
TechNyquist
1
@ TechNyquist: Ya, dengan beberapa std::;)
neuro
16
Jika Anda tidak dapat menggunakan std::to_stringdari C ++ 11, Anda dapat menulisnya seperti yang didefinisikan di cppreference.com:
std::string to_string( int value )
Mengonversi bilangan bulat desimal yang ditandatangani ke string dengan konten yang sama seperti apa yang std::sprintf(buf, "%d", value)akan menghasilkan untuk buf yang cukup besar.
Penerapan
#include<cstdio>#include<string>#include<cassert>
std::string to_string(int x ){int length = snprintf( NULL,0,"%d", x );
assert( length >=0);char* buf =newchar[length +1];
snprintf( buf, length +1,"%d", x );
std::string str( buf );delete[] buf;return str;}
Anda bisa berbuat lebih banyak dengannya. Cukup gunakan "%g"untuk mengkonversi float atau double ke string, gunakan "%x"untuk mengubah int ke representasi hex, dan sebagainya.
@DevSolar: Anda harus menguraikan. Contoh dorongan sudah diberikan. Solusi ini tersedia pada sebagian besar kompiler ketika boost tidak diinstal (atau persyaratan Anda melarang Anda menggunakannya untuk alasan apa pun). Cara ostreamkerjanya juga, sampai Anda perlu menyimpan string angka sebagai sesuatu selain format biner, oktal, atau hex (mis. Base-32).
Zac Howland
3
Saya tidak suka bila fungsi yang tidak standar suka itoa()atau stricmp()diberikan sebagai jawaban untuk apa pun .
DevSolar
6
Maaf menyinggung perasaan Anda, tapi saya nyatakan itu adalah fungsi non-standar dalam kalimat pertama. Saya tidak menyebutkannya, tetapi sprintfjuga dapat mencapai tujuan OP (meskipun masih kekurangan fleksibilitas jika diperlukan hal-hal selain angka dasar umum).
Zac Howland
1
Ya, Anda benar-benar menyatakannya, dan saya tidak mengecilkan jawaban Anda, bahkan ketika itu membuat saya gatal melakukannya. Jadi saya pikir kita genap. ;-)
DevSolar
8
Makro berikut tidak sepadat satu penggunaan ostringstreamatauboost::lexical_cast .
Tetapi jika Anda perlu konversi-ke-string berulang kali dalam kode Anda, makro ini lebih elegan digunakan daripada langsung menangani stringstreams atau casting eksplisit setiap waktu.
Ini juga sangat serbaguna, karena mengkonversi segala sesuatu yang didukung oleh operator<<(), bahkan dalam kombinasi.
Definisi:
#include<sstream>#define SSTR( x )dynamic_cast< std::ostringstream &>( \
( std::ostringstream()<< std::dec << x )).str()
Penjelasan:
Ini std::decadalah cara bebas efek samping untuk menjadikan anonim ostringstreammenjadi generik ostreamsehingga operator<<()fungsi pencarian berfungsi dengan benar untuk semua jenis. (Anda mendapat masalah sebaliknya jika argumen pertama adalah tipe pointer.)
The dynamic_castmengembalikan tipe kembali ke ostringstreamsehingga Anda dapat memanggil str()di atasnya.
Menggunakan:
#include<string>int main(){int i =42;
std::string s1 = SSTR( i );int x =23;
std::string s2 = SSTR("i: "<< i <<", x: "<< x );return0;}
@rubenvb: Anda memberi tahu saya cara mengubah ini menjadi templat dan saya akan memperbarui semua proyek C ++ yang saya gunakan dalam konstruksi ini.
DevSolar
@rubenvb: Maaf, itu tidak sejelas seharusnya. Saya tidak melihat cara bagaimana saya bisa mengubah ini menjadi templat (menggunakan C ++ 98) tanpa kehilangan kemampuan untuk output rantai daisy (seperti dalam contoh kedua saya), atau harus datang dengan kekacauan berbelit-belit untuk menangani sejumlah parameter dan tipe parameter.
DevSolar
@DevSolar: tidak akan inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }lakukan? (Belum diuji, tetapi saya ingin tahu apa yang salah dan mengapa?
rubenvb
@rubenvb: Itu akan dilakukan untuk seorang individu int(contoh pertama saya). Tapi tanpa ostreamterlihat oleh compiler di main(seperti yang tersembunyi dalam fungsi template), ia akan mencoba untuk mencari operator<<()untuk const char []di contoh kedua saya - yang akan parau. Saya tahu OP hanya meminta int, tetapi makro yang lebih umum ini sangat berguna (dan sebenarnya cukup luas) sehingga saya pikir saya akan memasukkannya di sini.
DevSolar
Untuk fleksibilitas saya lebih suka fungsi template. Untuk rantai daisy mungkin itu dapat ditangani dalam fungsi yang sama dengan sedikit RTTI ...
neuro
2
Anda dapat menggunakan fungsi ini untuk mengkonversi intke std::stringsetelah termasuk <sstream>:
to_string
likestd::string s = std::to_string(42)
Jawaban:
Anda dapat menggunakan std :: to_string di C ++ 11
sumber
sumber
boost::lexical_cast<std::string>(yourint)
dariboost/lexical_cast.hpp
Bekerja untuk semuanya dengan dukungan std :: ostream, tetapi tidak secepat, misalnya,
itoa
Bahkan tampaknya lebih cepat daripada stringstream atau scanf:
sumber
lexical_cast
dibawanya, tetapi merasa Boost cukup banyak kerja keras untuk tugas semacam ini ...Cara paling terkenal untuk melakukannya adalah menggunakan operator aliran:
Tentu saja Anda dapat menggeneralisasikannya untuk semua jenis menggunakan fungsi templat ^^
sumber
#include <sstream>
.std::
;)Jika Anda tidak dapat menggunakan
std::to_string
dari C ++ 11, Anda dapat menulisnya seperti yang didefinisikan di cppreference.com:Penerapan
Anda bisa berbuat lebih banyak dengannya. Cukup gunakan
"%g"
untuk mengkonversi float atau double ke string, gunakan"%x"
untuk mengubah int ke representasi hex, dan sebagainya.sumber
Fungsi non-standar, tetapi diterapkan pada kompiler paling umum:
Memperbarui
C ++ 11 memperkenalkan beberapa
std::to_string
kelebihan (perhatikan bahwa standarnya adalah base-10).sumber
ostream
kerjanya juga, sampai Anda perlu menyimpan string angka sebagai sesuatu selain format biner, oktal, atau hex (mis. Base-32).itoa()
ataustricmp()
diberikan sebagai jawaban untuk apa pun .sprintf
juga dapat mencapai tujuan OP (meskipun masih kekurangan fleksibilitas jika diperlukan hal-hal selain angka dasar umum).Makro berikut tidak sepadat satu penggunaan
ostringstream
atauboost::lexical_cast
.Tetapi jika Anda perlu konversi-ke-string berulang kali dalam kode Anda, makro ini lebih elegan digunakan daripada langsung menangani stringstreams atau casting eksplisit setiap waktu.
Ini juga sangat serbaguna, karena mengkonversi segala sesuatu yang didukung oleh
operator<<()
, bahkan dalam kombinasi.Definisi:
Penjelasan:
Ini
std::dec
adalah cara bebas efek samping untuk menjadikan anonimostringstream
menjadi generikostream
sehinggaoperator<<()
fungsi pencarian berfungsi dengan benar untuk semua jenis. (Anda mendapat masalah sebaliknya jika argumen pertama adalah tipe pointer.)The
dynamic_cast
mengembalikan tipe kembali keostringstream
sehingga Anda dapat memanggilstr()
di atasnya.Menggunakan:
sumber
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
lakukan? (Belum diuji, tetapi saya ingin tahu apa yang salah dan mengapa?int
(contoh pertama saya). Tapi tanpaostream
terlihat oleh compiler dimain
(seperti yang tersembunyi dalam fungsi template), ia akan mencoba untuk mencarioperator<<()
untukconst char []
di contoh kedua saya - yang akan parau. Saya tahu OP hanya memintaint
, tetapi makro yang lebih umum ini sangat berguna (dan sebenarnya cukup luas) sehingga saya pikir saya akan memasukkannya di sini.Anda dapat menggunakan fungsi ini untuk mengkonversi
int
kestd::string
setelah termasuk<sstream>
:sumber
Anda mungkin menyertakan implementasi itoa di proyek Anda.
Ini itoa dimodifikasi untuk bekerja dengan std :: string: http://www.strudel.org.uk/itoa/
sumber
Di sini, adalah cara mudah lain untuk mengonversi int ke string
Anda dapat mengunjungi tautan ini untuk metode lainnya https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
sumber
Misalkan saya punya
integer = 0123456789101112
. Sekarang, integer ini dapat dikonversi menjadi string olehstringstream
kelas.Berikut adalah kode dalam C ++:
sumber