Mengonversi int ke std :: string

143

Apa cara terpendek, lebih disukai inline-mampu, untuk mengkonversi int ke string? Jawaban menggunakan stl dan boost akan disambut.

Amir Rachum
sumber
63
Dalam C ++ 11 Anda dapat menggunakan to_stringlikestd::string s = std::to_string(42)
5
Panjang umur C ++ 11 dan to_string! :)
agustus
1
Kemungkinan duplikat dari cara termudah untuk mengonversi int ke string dalam C ++
UmNyobe

Jawaban:

350

Anda dapat menggunakan std :: to_string di C ++ 11

int i = 3;
std::string str = std::to_string(i);
Yochai Timmer
sumber
4
std :: to_string () tidak berfungsi di MinGW, jika ada yang peduli.
Archie
3
@parker Benar, sudah diperbaiki di gcc 4.8.0 saya kira. MinGW datang dengan Kode :: Blok terbaru (13.12) masih memiliki gcc 4.7.1.
Archie
47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
Benoit
sumber
36

boost::lexical_cast<std::string>(yourint) dari boost/lexical_cast.hpp

Bekerja untuk semuanya dengan dukungan std :: ostream, tetapi tidak secepat, misalnya, itoa

Bahkan tampaknya lebih cepat daripada stringstream atau scanf:

ltjax
sumber
15
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 ...
rubenvb
2
Berlebihan? Berdasarkan apa? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul
Sebaiknya pertimbangkan audiens Anda jika mereka tidak dapat menggunakan Boost
Damian
5
"Jawaban menggunakan stl dan boost akan disambut." - Penonton dipertimbangkan
Conrad Jones
30

Cara paling terkenal untuk melakukannya adalah menggunakan operator aliran:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

Tentu saja Anda dapat menggeneralisasikannya untuk semua jenis menggunakan fungsi templat ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}
neuro
sumber
1
Catatan: ini membutuhkan #include <sstream>.
TechNyquist
@ 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 = new char[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.

pengguna2622016
sumber
14

Fungsi non-standar, tetapi diterapkan pada kompiler paling umum:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

Memperbarui

C ++ 11 memperkenalkan beberapa std::to_stringkelebihan (perhatikan bahwa standarnya adalah base-10).

Zac Howland
sumber
3
@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 );
    return 0;
}
DevSolar
sumber
1
@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>:

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}
dodo
sumber
-2
#include <string>
#include <stdlib.h>

Di sini, adalah cara mudah lain untuk mengonversi int ke string

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

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/

Vipul Dungranee
sumber
harus menyertakan yang berikut untuk menggunakan file header metode ini #include <string> #include <stdlib.h>
Vipul Dungranee
-3

Misalkan saya punya integer = 0123456789101112. Sekarang, integer ini dapat dikonversi menjadi string olehstringstream kelas.

Berikut adalah kode dalam 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;

    }
Shawon
sumber
tidak serupa tetapi jawaban yang lebih lengkap sudah diberikan bertahun-tahun yang lalu?
Walter
Ya, tetapi jawaban ini sempurna menurut saya karena saya tidak mendapatkan jawaban yang efektif dari sebelumnya.
Shawon