Cara termudah untuk mengkonversi int ke string di C ++


1574

Apa cara termudah untuk mengkonversi dari intmenjadi setara stringdi C ++. Saya mengetahui 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();

4
Saya pikir kedua metode yang Anda berikan adalah solusi yang baik. itu tergantung pada konteks di mana Anda perlu melakukannya. Jika Anda sudah bekerja dengan stream, misalnya membaca atau menulis file, maka metode kedua Anda adalah yang terbaik. Jika Anda perlu meneruskan int sebagai string ke argumen fungsi, maka itoa bisa menjadi cara yang mudah. Tetapi sebagian besar waktu, konversi int ke string terjadi ketika berhadapan dengan file, jadi aliran sesuai.
Charles Brunet

41
Bagaimana opsi 1 bekerja untuk Anda? Pemahaman saya yang itoa()mengambil tiga parameter.
b1nary.atr0phy

1
itoa akan lebih cepat dari aliran yang setara. Ada juga cara menggunakan kembali buffer string dengan metode itoa (menghindari alokasi heap jika Anda sering menghasilkan string, misalnya untuk beberapa output numerik yang diperbarui dengan cepat). Atau Anda dapat membuat streambuf khusus untuk mengurangi beberapa alokasi biaya dll. Membangun aliran di tempat pertama juga bukan merupakan usaha berbiaya rendah.
Pete

6
@Pete: Setelah Anda mulai khawatir tentang mana yang lebih cepat, Anda ingin melihat stackoverflow.com/questions/4351371/…
Ben Voigt

20
Perhatikan bahwa itoa () bukan bagian dari standar dan karenanya menggunakannya membuat kode Anda tidak portabel karena tidak semua kompiler mendukungnya. Untuk Linux Anda pasti keluar kecuali Anda menggunakan sesuatu selain GCC, yang tidak mendukung fungsi ini. Jika Anda memiliki C ++ 0x, ikuti apa yang disarankan @Matthieu dalam jawabannya. Jika bukan itu masalahnya, gunakan stringstream karena ini adalah fitur yang didukung dengan baik dan kode Anda harus kompatibel dengan setiap kompiler C ++ di luar sana. Sebagai alternatif, Anda selalu bisa menggunakan sprintf ().
rbaleksandar

Jawaban:


2102

C ++ 11 memperkenalkan std::stoi(dan varian untuk setiap jenis numerik) dan std::to_string, rekan-rekan dari C atoidan itoatetapi dinyatakan dalam istilah std::string.

#include <string> 

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

Oleh karena itu cara terpendek yang dapat saya pikirkan. Anda bahkan dapat menghilangkan penamaan tipe, menggunakan autokata kunci:

auto s = std::to_string(42);

Catatan: lihat [string.conversions] ( 21.5 di n3242 )


199
to_stringbukan anggota stdperbaikan: stackoverflow.com/questions/12975341/…
Ben

36
Atau tergantung pada kompiler Anda, cukup tetapkan standar bahasa yang tepat:g++ -std=c++11 someFile.cc
Thomas M. DuBuisson

12
@Steve: seharusnya begitu. Ini adalah anggota stddi setiap kompiler yang saya tahu kecuali satu.
Mooing Duck

5
@ Matthiew M. Saya menggunakan yang sama yang Anda sarankan tetapi saya mendapatkan kesalahan ini: Error : No instance of overloaded function "std::to_string" matches the argument list saya menggunakan VS2010 c ++

19
@ Penerbangan: di bawah VS2010 Anda harus secara eksplisit melemparkan bilangan bulat konversi ke salah satu jenis berikut [_Longlong, _ULonglong, long double]; yaitu:string s = to_string((_ULonglong)i);
Zac

184

Mengambil diskusi dengan @ v.oddou beberapa tahun kemudian, C ++ 17 akhirnya memberikan cara untuk melakukan solusi agnostik tipe makro yang awalnya (disimpan di bawah) tanpa melalui keburukan makro.

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

Pemakaian:

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:

Karena "konversi ... ke string" adalah masalah berulang, saya selalu mendefinisikan makro SSTR () di header pusat sumber C ++ saya:

#include <sstream>

#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

Penggunaannya semudah:

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 kompatibel C ++ 98 (jika Anda tidak dapat menggunakan C ++ 11 std::to_string), dan tidak memerlukan pihak ketiga termasuk (jika Anda tidak dapat menggunakan Boost lexical_cast<>); kedua solusi lain ini memiliki kinerja yang lebih baik.


2
Saya tidak terlalu terbiasa dengan dynamic_casttetapi saya menggunakan dentang untuk mengkompilasi sehingga mengeluh tentang hal itu. Jika saya hanya menghilangkan dynamic_castmaka itu mengkompilasi dengan baik; apa tujuan dynamic_castlayanan dalam kasus ini? Kami sudah membuat ostringstream, jadi mengapa melemparkannya?
Mathew

2
@Mathew: Tautan dalam jawaban saya mengarah ke deskripsi terperinci dari setiap bagian konstruksi. Sementara kami menciptakan sebuah ostringstream, kita disebut operator<<()di atasnya, yang kembali ostream &- yang .str()tidak didefinisikan. Saya benar-benar bertanya-tanya bagaimana dentang akan membuat ini bekerja tanpa para pemain (atau mengapa itu menghasilkan kesalahan dengan itu). Konstruk ini diterbitkan di banyak tempat, dan saya telah menggunakannya selama lebih dari satu dekade pada banyak kompiler yang berbeda, termasuk MSVC, GCC, dan XLC, jadi saya agak terkejut dengan dentingan balk.
DevSolar

5
Baru saja datang ke pesta karena penasaran, dan downvoted. Alasan: terlalu banyak suara untuk solusi yang tidak elegan, dan cenderung lambat. 1. penggunaan makro. Saya tidak secara sistematis mengernyit tentang makro apa pun, tetapi yang ini terlalu pendek, dan klien akhir selalu takut pengulangan argumen, di atas ketakutan akan makro multilines yang tidak dilindungi. (tidak dilindungi oleh do {} while (0)) 2. dynamic_cast. sepertinya Anda hanya perlu static_cast di sini, kecuali jika Anda ingin menegaskan bahwa perpustakaan memang dilaksanakan sesuai harapan Anda. dalam hal ini Anda harus menggunakan boost :: polymorphic_downcast sebagai gantinya.
v.oddou

2
@ v.oddou: Anda bebas mengkritik, tentu saja. Tapi 1. tidak valid - makro adalah pernyataan tunggal, do { } while( 0 )tidak akan menambahkan apa pun. Dengan 2. dan 3. Anda mungkin mendapat poin - ini bisa dilakukan dengan pemeran statis, dan mungkin salah satu dari Anda penyihir templat di luar sana bisa muncul dengan antarmuka "lebih bagus". Tapi seperti yang saya katakan, ini bukan penemuan saya sendiri. Lihat-lihat, makro (makro!) Ini cukup di mana-mana. Itu adalah kasus POLA itu sendiri. Saya mungkin mempermainkan ini sedikit untuk membuatnya lebih "efisien".
DevSolar

1
@ v.oddou: Lihat apa yang saya temukan di antara barang-barang yang dibawa C ++ 17 kepada kami. :-) Saya harap Anda menyukai jawaban yang diperbarui.
DevSolar

109

Saya biasanya menggunakan metode berikut:

#include <sstream>

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

Dijelaskan secara rinci di sini .


2
Sebelum menggunakan ss, Anda perlu melakukannya ss.clear(). Saya telah melihat hasil yang tidak terduga tanpa inisialisasi ini.
lifebalance

14
@lifebalance: Saya belum pernah melihat perilaku seperti itu.
Rasoul

18
@ lifebalance: Anda tidak perlu ke objek clear()yang baru dibuat ostringstream. clear()me-reset flag kesalahan / eof, dan belum ada kondisi error / eof yang dihasilkan
Remy Lebeau

2
@Rasoul NumberToString(23213.123)menghasilkan 23213.1sambil std::to_string(23213.123)menghasilkan 23213.123000Apa yang terjadi di sana?
Killzone Kid

1
@KillzoneKid Ini karena std 'ostream stateful (ini berarti bahwa setiap perubahan status sebelumnya disimpan, seperti jumlah digit desimal) sementara metode ini dimulai dengan keadaan default.
xryl669

85

Mungkin cara paling mudah yang paling umum adalah membungkus pilihan kedua Anda ke dalam templat bernama lexical_cast, seperti yang ada di Boost , sehingga kode Anda terlihat seperti ini:

int a = 10;
string s = lexical_cast<string>(a);

Satu kebaikan dari ini adalah bahwa ia mendukung gips lain juga (misalnya, dalam arah yang berlawanan berfungsi juga).

Perhatikan juga bahwa meskipun Lexical_cast Boost dimulai sebagai hanya menulis ke stringstream, kemudian mengekstrak kembali dari aliran, sekarang memiliki beberapa tambahan. Pertama-tama, spesialisasi untuk beberapa jenis telah ditambahkan, jadi untuk banyak jenis umum, ini jauh lebih cepat daripada menggunakan stringstream. Kedua, sekarang memeriksa hasilnya, jadi (misalnya) jika Anda mengonversi dari string ke int, ia dapat melempar pengecualian jika string berisi sesuatu yang tidak dapat dikonversi ke int(misalnya, 1234akan berhasil, tetapi 123abcakan melempar) .

Pada C ++ 11, ada std::to_stringfungsi kelebihan untuk tipe integer, sehingga Anda dapat menggunakan kode seperti:

int a = 20;
std::string s = std::to_string(a);
// or: auto s = std::to_string(a);

Standar mendefinisikan ini sebagai setara dengan melakukan konversi dengan sprintf(menggunakan specifier konversi yang cocok dengan jenis objek yang disediakan, seperti %duntuk int), ke dalam buffer dengan ukuran yang cukup, kemudian membuat std::stringkonten buffer tersebut.


2
Bagus, saya lebih suka jawaban Kevin, meskipun ia menunjukkan include dan namespace. Hanya keluhan kecil. :) Tapi kerja bagus!
Jason R. Mick

4
Saya akan mengatakan ini adalah cara untuk pergi jika Anda tidak memiliki dukungan C ++ 11.
Alex

40

Jika Anda telah memasang Boost (yang seharusnya):

#include <boost/lexical_cast.hpp>

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

4
Menyetujui peningkatan instalasi. Saya pikir lebih dari satu orang akan memformat string. Untuk tujuan ini saya lebih suka boost :: format eg format ("% 02d", number) .str ()
Werner Erasmus

28

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 buat fungsi:

#include <sstream>

string IntToString(int a)
{
    ostringstream temp;
    temp << a;
    return temp.str();
}

18

Bukan yang saya tahu, di C + + murni. Namun sedikit modifikasi dari apa yang Anda sebutkan

string s = string(itoa(a));

harus bekerja, dan itu cukup singkat.


55
itoa()bukan fungsi standar!
kartunis

4
@cartoonist: Lalu apa itu?
user541686

20
Fungsi ini tidak didefinisikan dalam ANSI-C dan C ++. Jadi itu tidak didukung oleh beberapa kompiler seperti g ++.
kartunis

17

Anda dapat menggunakan yang std::to_stringtersedia di C ++ 11 seperti yang disarankan oleh Matthieu M .:

std::to_string(42);

Atau, jika kinerja sangat penting (misalnya, jika Anda melakukan banyak konversi), Anda dapat menggunakan fmt::format_intdari perpustakaan {fmt} untuk mengonversi integer menjadi std::string:

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

Atau string C:

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

Yang terakhir ini tidak melakukan alokasi memori dinamis dan lebih dari 10 kali lebih cepat daripada std::to_stringpada benchmark Boost Karma. Lihat Konversi integer cepat ke string dalam C ++ untuk detail lebih lanjut.

Perhatikan bahwa keduanya aman.

Tidak seperti std::to_string, fmt::format_inttidak memerlukan C ++ 11 dan bekerja dengan kompiler C ++.

Penafian: Saya penulis perpustakaan {fmt}.


2
Saya ingin tahu tentang klaim tidak memiliki alokasi memori dinamis sementara tetap threadsafe (masuk kembali), jadi saya membaca kode Anda - c_str()mengembalikan pointer ke buffer yang dideklarasikan di dalam fmt::FormatIntkelas - sehingga pointer yang dikembalikan tidak valid pada titik koma - lihat juga stackoverflow.com/questions/4214153/lifetime-of-temporaries
Soren

1
Ya, perilaku yang sama dengan std::string::c_str()(demikian penamaan). Jika Anda ingin menggunakannya di luar ekspresi penuh, buat sebuah objek. FormatInt f(42);Lalu, Anda dapat menggunakannya f.c_str()tanpa bahaya dihancurkan.
vitaut

1
Saya mendapatkan sesuatu yang aneh ketika saya mencoba mengkonversi dari int ke string menggunakan std :: to_string (num). Jika saya menyimpan hasilnya dalam sebuah variabel dan mencoba Mengaksesnya seperti stringNum [1] atau stringNum [n] ketika n bertambah, saya mendapatkan sampah.
user8951490

1
Itu jawaban pasti yang tepat untuk pertanyaan ini: kode efisien dan standar yang tidak stateful.
xryl669

16

sprintf()cukup bagus untuk konversi format. Anda kemudian dapat menetapkan string C yang dihasilkan ke string C ++ seperti yang Anda lakukan pada 1.


1
Heh, ya. Namun, saya biasanya mengandalkan snprintf () dan teman untuk konsekuensi apa pun ketika menangani string C.
Throwback1986

1
@ MatthieuM. Komentar Anda membuktikan lebih lanjut, bahwa Anda tidak. Jika output terpotong karena batas ini maka nilai kembali adalah jumlah karakter (tidak termasuk terminasi null byte) yang akan ditulis ke string akhir jika ruang yang cukup telah tersedia. Dengan demikian, nilai ukuran kembali atau lebih berarti bahwa output terpotong. Jadi Anda menyebutnya dengan NULLukuran a dan nol untuk mendapatkan ukuran buffer yang diperlukan.
user1095108

2
@ user1095108: Saya pikir Anda salah snprintf(perhatikan awalan SNP ) dan sprintf(perhatikan awalan SP ). Anda meneruskan ukuran ke yang pertama, dan itu berhati-hati untuk tidak meluap, namun yang terakhir tidak tahu ukuran buffer dan dengan demikian dapat meluap.
Matthieu M.

1
Idenya adalah untuk memanggil snprintfvarian pertama dan sprintfvarian setelah itu. Karena ukuran buffer diketahui saat itu, panggilan sprintfmenjadi sepenuhnya aman.
user1095108

1
@ user1095108 Ah, ya. Jika buffer pertama ke snprintf tidak cukup, nilai kembali memberitahu Anda apa yang akan cukup. Saya masih akan menggunakan snprintf untuk panggilan kedua, karena mengandalkan implementasi sprintf dan snprintf untuk mencocokkan tidak perlu berbahaya.
mabraham

11

Pertama termasuk:

#include <string>
#include <sstream>

Kedua, tambahkan metode:

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

Gunakan metode seperti ini:

NumberToString(69);

atau

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

10

Menggunakan stringstream untuk konversi angka berbahaya!

Lihat http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ di mana ia memberi tahu bahwa operator<<sisipan keluaran terformat.

Bergantung pada lokasi Anda saat ini, bilangan bulat yang lebih besar dari 3 digit, dapat dikonversi menjadi string 4 digit, menambahkan pemisah ribuan tambahan.

Misal, int = 1000bisa jadi convertet menjadi string 1.001. Ini bisa membuat operasi perbandingan tidak berfungsi sama sekali.

Jadi saya sangat merekomendasikan menggunakan std::to_stringcara. Lebih mudah dan melakukan apa yang Anda harapkan.

Diperbarui (lihat komentar di bawah) :

C ++ 17 menyediakan std::to_charsalternatif independen lokal berkinerja tinggi


2
Saya setuju bahwa ini adalah masalah serius jika Anda perlu bertukar data. Sayangnya, juga std::to_stringmenggunakan lokal saat ini (lihat en.cppreference.com/w/cpp/string/basic_string/to_string , bagian 'Catatan'). Hampir semua alat standar (dari stringstreams ke sprintf, tetapi juga sscanfdll) menggunakan lokal saat ini. Saya tidak menyadari hal ini sampai baru-baru ini ketika itu memukul saya dengan keras. Saat ini menggunakan barang buatan sendiri, tidak sulit untuk dibuat.
Bert Bril

Dalam tautan di atas juga ditetapkan bahwa C ++ 17 menyediakan std :: to_chars sebagai alternatif independen-lokal berkinerja tinggi.
YesThatIsMyName

Sayangnya, saya terjebak dengan C ++ 11 untuk tahun yang akan datang (untungnya sudah cukup, untungnya).
Bert Bril

1
from_chars dan to_chars akan sempurna tetapi sayangnya mereka tidak menawarkan varian wchar_t.
gast128

8

Untuk C ++ 98 , ada beberapa opsi:

boost/lexical_cast

Boost bukan bagian dari pustaka C ++, tetapi mengandung banyak ekstensi pustaka yang bermanfaat.

The lexical_castfungsi template menawarkan bentuk yang nyaman dan konsisten untuk mendukung konversi umum ke dan dari jenis sewenang-wenang ketika mereka direpresentasikan sebagai teks.
- Dokumentasi Boost

#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_castoperasi membutuhkan sekitar 80 mikrodetik (pada mesin saya) pada konversi pertama, dan kemudian mempercepat 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 dapat 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 dilaporkan. Saya tidak menginstal Visual Studio, yang dilaporkan dapat dikompilasi itoa.


sprintf

sprintf adalah fungsi pustaka standar C yang bekerja pada string C, dan merupakan alternatif yang benar-benar valid.

Membuat string dengan teks yang sama yang akan dicetak jika format digunakan pada printf, tetapi alih-alih dicetak, konten disimpan sebagai string C dalam buffer yang 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.hsundulan mungkin tidak diperlukan. Sedangkan untuk runtime, sprintfoperasi membutuhkan sekitar 40 mikrodetik (pada mesin saya) pada konversi pertama, dan kemudian mempercepat setelah itu jika dilakukan secara berlebihan.


stringstream

Ini adalah cara utama pustaka C ++ untuk mengonversi bilangan bulat menjadi string, dan sebaliknya. Ada fungsi saudara serupa dengan stringstreamyang selanjutnya membatasi penggunaan yang dimaksudkan aliran, seperti ostringstream. Menggunakan ostringstreamsecara khusus memberi tahu pembaca kode Anda bahwa Anda hanya bermaksud menggunakan <<operator, pada dasarnya. Fungsi ini adalah yang paling penting untuk mengonversi bilangan bulat menjadi string. Lihat pertanyaan ini untuk diskusi lebih lanjut.

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

Adapun runtime, ostringstreamoperasi membutuhkan sekitar 71 mikrodetik (pada mesin saya), dan kemudian mempercepat setelah itu jika dilakukan secara berlebihan, tetapi tidak sebanyak fungsi sebelumnya .


Tentu saja ada opsi lain, dan Anda bahkan dapat membungkus salah satu dari ini ke dalam fungsi Anda sendiri, tetapi ini menawarkan tampilan analitis pada beberapa yang populer.


Terima kasih telah menjaga kami (pengguna C ++ 98)
A. B

@ AB Saya tidak bisa percaya masih ada pengguna C ++ 98 yang tersisa.
Kotauskas

@VladislavToncharov Ketika pekerjaan Anda semata-mata untuk mendukung peralatan dan kode lama, Anda membuang barang lama menggunakan standar industri yang lebih segar. Musim panas lalu, saya menulis kode dengan Python 2.3.
Joshua Detwiler

@ JoshuaDetwiler Oh, lupa tentang itu, maaf.
Kotauskas

4

C ++ 17 menyediakan std :: to_chars sebagai alternatif independen-lokal berkinerja tinggi.


3

Agak mudah untuk menambahkan beberapa gula sintaksis yang memungkinkan seseorang untuk menyusun string dengan cepat dengan cara seperti aliran

#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 apa pun yang Anda inginkan (asalkan ada operator << (std::ostream& ..)yang ditentukan untuknya) strmake()dan menggunakannya sebagai pengganti std::string.

Contoh:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

2

Diedit. Jika Anda membutuhkan cepat konversi integer dengan jumlah tetap digit ke char * kiri-empuk dengan '0' , ini adalah contoh untuk arsitektur little-endian (semua x86, x86_64 dan lain-lain):

Jika Anda mengonversi nomor dua digit:

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

Jika Anda mengonversi angka tiga digit:

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

Jika Anda mengonversi angka empat digit:

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

Demikian seterusnya hingga tujuh digit angka. Dalam contoh ini nadalah bilangan bulat yang diberikan. Setelah konversi itu representasi string dapat diakses sebagai (char*)&s:

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

CATATAN: Jika Anda membutuhkannya pada pesanan byte big-endian, meskipun saya tidak mengujinya, tetapi di sini adalah sebuah contoh: untuk nomor tiga digit itu int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;untuk nomor empat digit (lengkungan 64 bit): int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;Saya pikir itu harus bekerja.


2
Bagaimana dengan byte-order?
shjeff

Bukankah ini perilaku tidak terdefinisi karena aliasing pointer?
dgnuff

1
@shjeff terima kasih atas komentarnya, saya menambahkan catatan tentang endianness pada jawabannya.
Alek

@ Dgnuff terima kasih telah menunjukkan ini, meskipun saya tidak punya masalah dengan ini, Anda benar. Saya sedikit mengubah jawabannya sehingga sesuai dengan Aturan Mengatasi Ketat, terima kasih.
Alek

1

Menggunakan:

#define convertToString(x) #x

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

3
Hanya berfungsi dengan angka literal, tidak mengevaluasi konten variabel, meskipun terkadang bermanfaat.
Wolf

Baik. Tapi pasti berguna saat itu
maverick9888

1
Hanya bekerja pada waktu kompilasi dengan angka konstanta literal, saya pikir OP meminta konversi dinamis, menggunakan bilangan bulat variabel
Ing. Gerardo Sánchez

0

Saya menggunakan:

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

Ia bekerja pada kompiler Windows dan Linux g ++ saya.


0

Inilah cara mudah lainnya untuk dilakukan

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

sprintf adalah yang terkenal untuk memasukkan data apa pun ke dalam string format yang diperlukan.

Anda dapat mengubah char *array menjadi string seperti yang ditunjukkan pada baris ketiga.


0

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

Pada dasarnya menggunakan apa? stringstream?
Peter Mortensen

@PeterMortensen Perhatikan baik-baik, inistd::to_string()
Kotauskas

saya punya using namespace std;:)
Gonçalo Garrido

0

C ++ 11 diperkenalkan std::to_string()untuk tipe numerik:

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

4
Hai! Bisakah Anda menambahkan penjelasan tentang mengapa dan bagaimana ini memberikan jawaban untuk pertanyaan itu?
anothernode

0

Menggunakan:

#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
Gagal total untuk 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
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan jangka pendek terbatas. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Toby Speight

Benar-benar gagal untuk n≤0
Toby Speight

Tambahkan komentar, jelaskan jawaban Anda, baca cara menjawab .
Aksen P

-1

Jika Anda menggunakan MFC , Anda dapat menggunakan CString:

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

8
Anda harus mencatat bahwa ini adalah ekstensi Microsoft saja: msdn.microsoft.com/en-us/library/ms174288.aspx
JonnyJD

1
Saya suka ide CString :: Format (). Sayangnya itu bukan MS portable.
Nick

1
Saya telah memperbarui jawaban saya untuk memasukkan informasi dari komentar Anda @JonnyJD, karena saya terus-menerus dipilih untuk itu 5 tahun kemudian ..
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
kebocoran memori, -1 dari saya
paulm

Baunya seperti buffer overrun.
Kotauskas

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

Anda sekarang dapat menggunakan to_string(5).


10
Sementara solusi ini berhasil, sangat tidak disarankan! Nama yang dimulai dengan garis bawah dan huruf kapital dicadangkan untuk kompiler, Anda tidak boleh menggunakannya. Menyuntikkan fungsi ke stdnamespace juga bukan sesuatu yang harus Anda lakukan. Selain itu, sepertinya tidak _MAX_INT_DIGmerupakan makro standar, jadi jika didefinisikan secara salah, kode ini memiliki potensi besar untuk menginduksi perilaku yang tidak terdefinisi. -1
iFreilicht

6
Apa itu _MAX_INT_DIG dan mengapa itu digandakan?
paulm

-2

Saya pikir menggunakan stringstreamcukup mudah:

 string toString(int n)
 {
     stringstream ss(n);
     ss << n;
     return ss.str();
 }

 int main()
 {
    int n;
    cin >> n;
    cout << toString(n) << endl;
    return 0;
 }

Ini disebutkan dalam pertanyaan, dan sayangnya cukup lambat.
Kotauskas

-3

Anda menggunakan tipe konter algoritma untuk mengkonversi ke string. Saya mendapatkan teknik ini dari pemrograman Commodore 64 komputer. Ini juga bagus untuk pemrograman game.

  • Anda mengambil bilangan bulat dan mengambil setiap digit yang diberi bobot oleh kekuatan 10. Jadi anggap bilangan bulat adalah 950.

    • Jika bilangan bulat sama dengan atau lebih besar dari 100.000 maka kurangi 100.000 dan tambah penghitung dalam string di ["000000"];
      terus melakukannya sampai tidak ada lagi angka di posisi 100.000. Jatuhkan kekuatan sepuluh lainnya.

    • Jika bilangan bulat sama dengan atau lebih besar dari 10.000 maka kurangi 10.000 dan tambah penghitung dalam string pada ["000000"] +1 posisi;
      terus lakukan sampai tidak ada lagi angka di posisi 10.000.

  • Jatuhkan kekuatan sepuluh lainnya

  • Ulangi polanya

Saya tahu 950 terlalu kecil untuk digunakan sebagai contoh, tetapi saya harap Anda mendapatkan idenya.


Sangat tidak membantu untuk menggambarkan suatu algoritma, daripada menunjukkan contoh dalam kode.
cdeerinck
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.