[c++] Il modo più semplice per convertire int in string in C ++



10 Answers

Poiché "convertire ... in stringa" è un problema ricorrente, definisco sempre la macro SSTR() in un'intestazione centrale dei miei sorgenti C ++:

#include <sstream>

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

L'utilizzo è facile come potrebbe essere:

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

Quanto sopra è compatibile con C ++ 98 (se non puoi usare C ++ 11 std::to_string ), e non ha bisogno di std::to_string terze parti (se non puoi usare Boost lexical_cast<> ); entrambe queste altre soluzioni hanno comunque prestazioni migliori.

Question

Qual è il modo più semplice per convertire da int a string equivalente in C ++. Sono a conoscenza di due metodi. C'è un modo più semplice?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();



Non sarebbe più semplice usare i diagrammi?

#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

Oppure fai una funzione:

#include <sstream>

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



Si utilizza un tipo di contatore di algoritmo per convertire in una stringa. Ho ottenuto questa tecnica dalla programmazione dei computer Commodore 64 . È anche un bene per la programmazione di giochi.

  • Prendi il numero intero e prendi ogni cifra che è ponderata con i poteri di 10. Quindi supponi che il numero intero sia 950.

    • Se il numero intero è uguale o superiore a 100.000, sottrarre 100.000 e aumentare il contatore nella stringa a ["000000"];
      continua a farlo fino a quando non ci saranno più numeri in posizione 100.000. Lascia un altro potere di dieci

    • Se il numero intero è uguale o maggiore di 10.000, sottrarre 10.000 e aumentare il contatore nella stringa a ["000000"] + 1 posizione;
      continua a farlo fino a quando non ci saranno più numeri in posizione 10.000.

  • Lascia un altro potere di dieci

  • Ripeti il ​​modello

So che 950 è troppo piccolo per essere usato come esempio ma spero che tu abbia l'idea.




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



Probabilmente il modo più semplice in modo semplice avvolge essenzialmente la tua seconda scelta in un modello chiamato lexical_cast , come quello in Boost , quindi il tuo codice è simile al seguente:

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

Una buona parte di questo è che supporta anche altri cast (ad esempio, nella direzione opposta funziona altrettanto bene).

Si noti inoltre che, sebbene Boost lexical_cast sia iniziato come una semplice scrittura su uno stringstream, quindi si estrae nuovamente dallo stream, ora ha un paio di aggiunte. Prima di tutto, sono state aggiunte specializzazioni per diversi tipi, quindi per molti tipi comuni, è sostanzialmente più veloce rispetto all'utilizzo di uno stringstream. Secondo, ora controlla il risultato, quindi (per esempio) se si converte da una stringa a una int , si può generare un'eccezione se la stringa contiene qualcosa che non può essere convertito in un int (ad esempio, 1234 avrebbe avuto successo, ma 123abc avrebbe gettato).

A partire da C ++ 11, c'è una funzione std::to_string sovraccaricata per i tipi interi, quindi puoi usare un codice come:

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

Lo standard definisce questi come equivalenti a fare la conversione con sprintf (usando lo specificatore di conversione che corrisponde al tipo di oggetto fornito, come %d per int ), in un buffer di dimensioni sufficienti, quindi creando una std::string contenuto di quel buffer




Usare lo stringstream per la conversione del numero è pericoloso!

Vedere http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ dove indica che l' operator<< inserisce l'output formattato.

A seconda delle impostazioni locali correnti, un numero intero maggiore di 3 cifre potrebbe essere convertito in una stringa di 4 cifre, aggiungendo un separatore extra di migliaia.

Ad esempio, int = 1000 potrebbe essere convertito in una stringa 1.001 . Ciò potrebbe rendere le operazioni di confronto non funzionanti affatto.

Quindi consiglio vivamente di usare la modalità std::to_string . È più facile e fa quello che ti aspetti.




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

ora puoi usare to_string(5)




Se hai bisogno di una conversione rapida di un numero intero con un numero fisso di cifre in char * con riempimento a sinistra con '0', questo è un esempio pratico:

int n = 27;
char s[8];

Se stai convertendo un numero a due cifre:

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

Se stai convertendo un numero a tre cifre:

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

Se si sta convertendo un numero a quattro cifre:

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

E così via fino a numeri a sette cifre :)




Puoi usare std::to_string disponibile in C ++ 11 come suggerito da Matthieu M .:

std::to_string(42);

Oppure, se le prestazioni sono fondamentali (ad esempio, se si eseguono molte conversioni), è possibile utilizzare fmt::FormatInt dalla libreria di formato C ++ per convertire un numero intero in std::string :

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

O una stringa C:

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

Quest'ultimo non fa allocazioni di memoria dinamica ed è più di 10 volte più veloce di std::to_string sui benchmark di Boost Karma. Vedi Fast integer per convertire le stringhe in C ++ per maggiori dettagli.

A differenza di std::to_string , fmt::FormatInt non richiede C ++ 11 e funziona con qualsiasi compilatore C ++.

Disclaimer: sono l'autore della libreria di formato C ++.




sprintf() è abbastanza buono per la conversione del formato. Puoi quindi assegnare la stringa C risultante alla stringa C ++ come hai fatto in 1.




Io uso:

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

Funziona con i miei compilatori windows e linux g ++.




Related