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.



63
Dalam C ++ 11 Anda dapat menggunakan to_stringlikestd::string s = std::to_string(42)

5
Panjang umur C ++ 11 dan to_string! :)
agustus

Jawaban:


350

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

int i = 3;
std::string str = std::to_string(i);

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

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:


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


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

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.


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).


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

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



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

    }

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
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.