Conversione di un int in std :: string


143

Qual è il modo più breve, preferibilmente in linea, di convertire un int in una stringa? Le risposte che usano stl e boost saranno benvenute.



63
In C ++ 11 puoi usare to_stringlikestd::string s = std::to_string(42)

5
Lunga vita a C ++ 11 e to_string! :)
agosto

Risposte:


351

È possibile utilizzare std :: to_string in C ++ 11

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

4
std :: to_string () non funziona in MinGW, se qualcuno se ne frega.
Archie,

3
@bparker Giusto, è stato corretto in gcc 4.8.0 credo. MinGW in arrivo con l'ultimo Code :: Blocks (13.12) ha ancora 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) a partire dal boost/lexical_cast.hpp

Funziona per tutto con il supporto std :: ostream, ma non è veloce come, ad esempio, itoa

Sembra persino essere più veloce di stringstream o scanf:


15
Boost è tuo amico, se non ci fosse un modo semplice per farlo in Standard C ++ ... Ovviamente mi piace ciò che lexical_castporta, ma sento che Boost è praticamente eccessivo per questo tipo di compiti ...
rubenvb,


Dovrebbero considerare il tuo pubblico se non sono in grado di utilizzare Boost
Damian il

5
"Le risposte che usano stl e boost saranno benvenute." - Pubblico considerato
Conrad Jones,

30

Bene, il modo ben noto per farlo è usare l'operatore stream:

#include <sstream>

std::ostringstream s;
int i;

s << i;

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

Ovviamente puoi generalizzarlo per qualsiasi tipo usando una funzione template ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
Nota: questo richiede #include <sstream>.
TechNyquist,

@TechNyquist: hai ragione. Non voleva essere compilabile, ma è cambiato!
Neuro

1
Quindi non intendevi che fosse compilabile, ma in realtà con l'inclusione è :)
TechNyquist,

1
@TechNyquist: Sì, con alcuni std::;)
neuro

16

Se non è possibile utilizzare std::to_stringda C ++ 11, è possibile scriverlo come definito su cppreference.com:

std::string to_string( int value ) Converte un numero intero decimale con segno in una stringa con lo stesso contenuto di ciò std::sprintf(buf, "%d", value)che produrrebbe per un buf sufficientemente grande.

Implementazione

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

Puoi fare di più con esso. Basta usare "%g"per convertire float o double in stringa, usare "%x"per convertire int in rappresentazione esadecimale e così via.


14

Funzione non standard, ma implementata sui compilatori più comuni:

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

Aggiornare

C ++ 11 ha introdotto diversi std::to_stringsovraccarichi (si noti che per impostazione predefinita è base-10).


3
@DevSolar: dovresti elaborare. L'esempio boost era già stato fornito. Questa soluzione è disponibile sulla maggior parte dei compilatori quando boost non è installato (o i tuoi requisiti ti vietano di usarlo per qualsiasi motivo). Le ostreamopere come bene, fino al momento di salvare il numero-stringa come qualcosa di diverso da un binario, ottale, o formato esadecimale (ad esempio, di base-32).
Zac Howland,

3
Non mi piace quando funzioni non standard come itoa()o stricmp()vengono fornite come risposta a qualsiasi cosa .
DevSolar,

6
Mi dispiace offendere la tua sensibilità, ma ho affermato che era una funzione non standard nella prima frase. Non ne ho parlato, ma sprintfposso anche raggiungere l'obiettivo dell'OP (anche se soffre ancora della mancanza di flessibilità se è necessario qualcosa di diverso dai numeri di base comuni).
Zac Howland,

1
Sì, l'hai detto tu, e non ho votato in negativo la tua risposta, anche quando mi ha fatto venire voglia di farlo. Quindi penso che siamo pari. ;-)
DevSolar il

8

La seguente macro non è così compatta come quella monouso ostringstreamo boost::lexical_cast.

Ma se hai bisogno di conversione ripetuta in stringa nel tuo codice, questa macro è più elegante nell'uso rispetto alla gestione diretta di stringhe o casting espliciti ogni volta.

È anche molto versatile, in quanto converte tutto supportato da operator<<(), anche in combinazione.

Definizione:

#include <sstream>

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

Spiegazione:

Il std::decè un modo senza effetto collaterale di rendere l'anonima ostringstreamin una generica ostreamcosì operator<<()funzione di ricerca funziona correttamente per tutti i tipi. (In caso contrario, potresti avere problemi se il primo argomento è un tipo di puntatore.)

Il dynamic_castrestituisce il tipo di nuovo al ostringstreammodo da poter chiamare str()su di esso.

Uso:

#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: Mi dici come trasformarlo in un modello e aggiornerò tutti i progetti C ++ in cui ho usato questo costrutto.
DevSolar

@rubenvb: mi dispiace, non era così chiaro come avrebbe dovuto essere. Non vedo il modo in cui potrei trasformarlo in un modello (usando C ++ 98) senza perdere l'abilità di output a catena (come nel mio secondo esempio), o dover inventare un disordine contorto per gestire qualsiasi numero di parametri e tipi di parametri.
DevSolar,

@DevSolar: non lo inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }farebbe? (Non ho testato, ma mi chiedo cosa sarebbe andato storto e perché?
rubenvb,

@rubenvb: lo farebbe per un individuo int(il mio primo esempio). Ma senza il ostreamvisibile per il compilatore in main(come è nascosto all'interno della funzione del modello), cercherà di guardare in alto operator<<()per il const char []mio secondo esempio - che gracchiare. So che l'OP ha richiesto solo un int, ma questa macro più generica è così utile (e in realtà abbastanza diffusa) che ho pensato di includerla qui.
DevSolar,

Per la versatilità preferisco una funzione modello. Forse per il daisy-chain può essere gestito nella stessa funzione con un po 'di RTTI ...
Neuro,

2

È possibile utilizzare questa funzione per convertire intin std::stringdopo aver incluso <sstream>:

#include <sstream>

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



-3

Supponiamo di averlo fatto integer = 0123456789101112. Ora, questo numero intero può essere convertito in una stringa dalla stringstreamclasse.

Ecco il codice in 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;

    }

non erano risposte simili ma più complete già fornite molti anni fa?
Walter,

Sì, ma questa risposta è perfetta, penso che non ho ricevuto alcuna risposta efficace dalla precedente.
Shawon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.