Il modo più semplice per convertire int in stringa in C ++


1574

Qual è il modo più semplice per convertire da intin equivalente stringin 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();

4
Penso che entrambi i metodi che hai dato siano buone soluzioni. dipende dal contesto in cui è necessario farlo. Se stai già lavorando con stream, ad esempio leggendo o scrivendo un file, il tuo secondo metodo è il migliore. Se hai bisogno di passare un int come stringa a un argomento di funzione, allora potrebbe essere un modo semplice. Ma la maggior parte delle volte, la conversione da int a stringa si verifica quando si tratta di file, quindi i flussi sono appropriati.
Charles Brunet,

41
Come funziona anche l'opzione 1 per te? È la mia comprensione che itoa()accetta tre parametri.
b1nary.atr0phy

1
itoa sarà più veloce dell'equivalente stream. Esistono anche modi per riutilizzare il buffer di stringhe con il metodo itoa (evitando allocazioni di heap se si generano spesso stringhe, ad esempio per un output numerico in rapido aggiornamento). In alternativa, puoi generare uno streambuf personalizzato per ridurre parte del sovraccarico di allocazione, ecc. Costruire il flusso in primo luogo non è un'impresa a basso costo.
Pete,

6
@Pete: una volta che inizi a preoccuparti di quale è più veloce, ti consigliamo di guardare stackoverflow.com/questions/4351371/…
Ben Voigt

20
Nota che itoa () non fa parte dello standard e quindi il suo utilizzo rende il tuo codice non portatile poiché non tutti i compilatori lo supportano. Per Linux sei sicuramente fuori a meno che tu non stia usando qualcosa di diverso da GCC, che non supporta questa funzione. Se hai C ++ 0x, segui ciò che @Matthieu ha suggerito nella sua risposta. In caso contrario, utilizza stringstream poiché è una funzionalità ben supportata e il tuo codice dovrebbe essere compatibile con tutti i compilatori C ++ disponibili. In alternativa puoi sempre scegliere sprintf ().
rbaleksandar,

Risposte:


2102

C ++ 11 introduce std::stoi(e varianti per ciascun tipo numerico) e std::to_string, le controparti della C atoie itoama espresse in termini di std::string.

#include <string> 

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

è quindi il modo più breve che mi viene in mente. Puoi anche omettere di nominare il tipo, usando la autoparola chiave:

auto s = std::to_string(42);

Nota: vedere [string.conversions] ( 21.5 in n3242 )


199
to_stringnon un membro della stdcorrezione: stackoverflow.com/questions/12975341/…
Ben

36
O a seconda del compilatore, basta impostare lo standard linguistico giusto:g++ -std=c++11 someFile.cc
Thomas M. DuBuisson

12
@Steve: dovrebbe essere. È membro di stdogni compilatore che conosco tranne uno.
Mooing Duck

5
@Matthiew M. Sto usando lo stesso che tu suggerisci ma sto ottenendo questo errore: Error : No instance of overloaded function "std::to_string" matches the argument list sto usando VS2010 c ++

19
@Flying: sotto VS2010 devi espressamente lanciare il numero intero convertito in uno dei seguenti tipi [_Longlong, _ULonglong, long double]; vale a dire:string s = to_string((_ULonglong)i);
Zac,

184

Raccogliendo una discussione con @ v.oddou un paio di anni dopo, C ++ 17 ha finalmente fornito un modo per fare la soluzione di tipo agnostico originariamente basata su macro (conservata sotto) senza passare attraverso la bruttezza delle macro.

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

Uso:

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

Risposta originale:

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

#include <sstream>

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

L'utilizzo è semplice 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 è possibile utilizzare C ++ 11 std::to_string) e non necessita di inclusioni di terze parti (se non è possibile utilizzare Boost lexical_cast<>); entrambe queste altre soluzioni offrono prestazioni migliori.


2
Non ho molta familiarità con dynamic_castma sto usando clang per compilare, quindi se ne lamenta. Se ometto solo dynamic_castallora si compila bene; quale scopo dynamic_castserve in questo caso? Stiamo già creando un ostringstream, quindi perché lanciarlo?
Mathew,

2
@Mathew: il link nella mia risposta porta a una descrizione dettagliata di ogni parte del costrutto. Mentre abbiamo creato un ostringstream, l'abbiamo chiamato operator<<(), che ritorna ostream &- per il quale .str()non è definito. Mi chiedo davvero come clang farebbe funzionare questo senza il cast (o perché genera un errore). Questo costrutto è stato pubblicato in molti luoghi e l'ho usato per oltre un decennio su molti compilatori diversi, tra cui MSVC, GCC e XLC, quindi sono piuttosto sorpreso che ci si senta a bocca aperta.
DevSolar,

5
Sono appena arrivato alla festa per curiosità e ho votato in downgrade. Motivo: troppi voti per una soluzione non elegante e probabilmente lenta. 1. utilizzo macro. Non aggrotto sistematicamente nessuna macro, ma questa è troppo breve e i clienti finali temono sempre la ripetizione dell'argomento, oltre alla paura per le macro di multiline non protette. (non protetto da do {} while (0)) 2. dynamic_cast. sembra che tu abbia bisogno solo di un static_cast qui, a meno che tu non voglia affermare che la libreria è effettivamente implementata come speri. nel qual caso dovresti usare invece boost :: polymorphic_downcast.
v.oddou,

2
@ v.oddou: sei libero di criticare, ovviamente. Ma 1. non è valido - la macro è una singola istruzione, do { } while( 0 )non aggiungerebbe nulla. Con 2. e 3. probabilmente hai un punto: questo potrebbe essere fatto con un cast statico, e forse uno di voi maghi modello potrebbe trovare un'interfaccia "più bella". Ma come ho detto, questa non è affatto un'invenzione di me stesso. Guardati intorno, questa macro (macro!) È abbastanza onnipresente. Questo è un caso di POLA in sé. Potrei giocarci un po 'per renderlo più "ottimizzato".
DevSolar,

1
@ v.oddou: guarda cosa ho trovato tra le cose che ci ha portato C ++ 17. :-) Spero che ti piaccia la risposta aggiornata.
DevSolar

109

Di solito uso il seguente metodo:

#include <sstream>

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

È descritto in dettaglio qui .


2
Prima di utilizzare ss, è necessario ss.clear(). Ho visto risultati inaspettati senza questa inizializzazione.
lifebalance

14
@lifebalance: non ho mai visto un simile comportamento.
Rasoul,

18
@lifebalance: non è necessario clear()un ostringstreamoggetto appena creato . clear()ripristina i flag di errore / eof e non è stata ancora generata alcuna condizione di errore / eof.
Remy Lebeau,

2
@Rasoul NumberToString(23213.123)produce 23213.1while std::to_string(23213.123)produce 23213.123000Cosa succede lì?
Killzone Kid,

1
@KillzoneKid Questo perché std 'ostream è stateful (questo significa che qualsiasi precedente cambio di stato viene mantenuto, come il numero di cifre decimali) mentre questo metodo inizia con uno stato predefinito.
xryl669,

85

Probabilmente il modo più comune per incorporare 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);

Un aspetto interessante è 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 un flusso di stringhe, per poi estrarre nuovamente dallo stream, ora ha un paio di aggiunte. Prima di tutto, sono state aggiunte specializzazioni per parecchi tipi, quindi per molti tipi comuni è sostanzialmente più veloce dell'uso di una stringa. In secondo luogo, ora controlla il risultato, quindi (ad esempio) se si converte da una stringa in una int, può generare un'eccezione se la stringa contiene qualcosa che non può essere convertito in una int(ad esempio, 1234avrebbe esito positivo, ma 123abcverrebbe lanciata) .

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

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

Lo standard definisce questi come equivalenti a fare la conversione con sprintf(usando l'identificatore di conversione che corrisponde al tipo di oggetto fornito, come %dper int), in un buffer di dimensioni sufficienti, quindi creando un std::stringcontenuto di quel buffer.


2
Bello, preferisco la risposta di Kevin, anche se mentre mostra l'inclusione e lo spazio dei nomi. Solo una piccola lamentela. :) Ottimo lavoro, però!
Jason R. Mick,

4
Direi che questa è la strada da percorrere se non si dispone del supporto C ++ 11.
Alex,

40

Se hai installato Boost (che dovresti):

#include <boost/lexical_cast.hpp>

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

4
Concordato sull'installazione boost. Penso che più spesso si formattare la stringa. A tale scopo preferisco boost :: format, ad esempio format ("% 02d", numero) .str ()
Werner Erasmus,

28

Sarebbe più semplice usare i flussi di stringhe:

#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

O fai una funzione:

#include <sstream>

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

18

Non che io sappia, in puro C ++. Ma una piccola modifica di ciò che hai menzionato

string s = string(itoa(a));

dovrebbe funzionare, ed è piuttosto breve.


55
itoa()non è una funzione standard!
vignettista

4
@cartoonist: Allora che cos'è?
user541686,

20
Questa funzione non è definita in ANSI-C e C ++. Quindi non è supportato da alcuni compilatori come g ++.
vignettista

17

È possibile utilizzare std::to_stringdisponibile in C ++ 11 come suggerito da Matthieu M .:

std::to_string(42);

Oppure, se le prestazioni sono fondamentali (ad esempio, se si effettuano molte conversioni), è possibile utilizzare fmt::format_intdalla libreria {fmt} per convertire un numero intero in std::string:

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

O una stringa C:

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

Quest'ultimo non esegue alcuna allocazione dinamica della memoria ed è oltre 10 volte più veloce rispetto std::to_stringai benchmark Boost Karma. Vedere Conversione da numero intero veloce a stringa in C ++ per maggiori dettagli.

Si noti che entrambi sono thread-safe.

Diversamente std::to_string, fmt::format_intnon richiede C ++ 11 e funziona con qualsiasi compilatore C ++.

Disclaimer: sono l'autore della libreria {fmt}.


2
Ero curioso di affermare di non avere alcuna allocazione dinamica della memoria mentre rimanevo thread-safe (rientrante), quindi ho letto il tuo codice - c_str()restituisce un puntatore a un buffer dichiarato all'interno della fmt::FormatIntclasse - quindi il puntatore restituito non sarà valido su il punto e virgola - vedi anche stackoverflow.com/questions/4214153/lifetime-of-temporaries
Soren

1
Sì, lo stesso comportamento di std::string::c_str()(quindi la denominazione). Se vuoi usarlo al di fuori dell'espressione completa costruisci un oggetto FormatInt f(42);Quindi puoi usarlo f.c_str()senza il pericolo che venga distrutto.
vitaut,

1
Ottengo qualcosa di strano quando provo a convertire da int a stringa usando std :: to_string (num). Se memorizzo il risultato in una variabile e provo ad accedervi come stringNum [1] o stringNum [n] all'aumentare di n, ottengo immondizia.
user8951490

1
Questa è sicuramente la risposta giusta a questa domanda: un codice efficiente e standard che non sia stato.
xryl669,

16

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


1
Eh si. Tuttavia, di solito mi affido a snprintf () e agli amici per qualsiasi cosa di conseguenza nella gestione delle stringhe C.
Ritorno al passato86

1
@MatthieuM. Il tuo commento dimostra inoltre che non lo sei. Se l'output è stato troncato a causa di questo limite, il valore restituito è il numero di caratteri (escluso il byte null terminante) che sarebbero stati scritti nella stringa finale se fosse stato disponibile spazio sufficiente. Pertanto, un valore di ritorno di dimensione o superiore indica che l'output è stato troncato. Quindi lo chiami con una NULLdimensione pari a zero per ottenere la dimensione del buffer necessaria.
user1095108

2
@ user1095108: Penso che tu stia sbagliando snprintf(nota il prefisso SNP ) e sprintf(nota il prefisso SP ). Si passa la dimensione alla prima e si occupa di non traboccare, tuttavia quest'ultima non conosce la dimensione del buffer e quindi potrebbe traboccare.
Matthieu M.,

1
L'idea è di chiamare snprintfprima una sprintfvariante e una variante dopo. Poiché la dimensione del buffer è ormai nota, la chiamata sprintfdiventa completamente sicura.
user1095108

1
@ user1095108 Ah, sì. Se il primo buffer di snprintf è insufficiente, il valore restituito indica quale sarebbe sufficiente. Userei ancora snprintf per la seconda chiamata, perché fare affidamento sulle implementazioni di sprintf e snprintf per abbinarle è inutilmente pericoloso.
mabraham,

11

In primo luogo includere:

#include <string>
#include <sstream>

In secondo luogo aggiungere il metodo:

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

Usa il metodo in questo modo:

NumberToString(69);

o

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

10

L'uso di stringstream per la conversione dei numeri è pericoloso!

Vedi http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ dove dice che operator<<inserisce output formattato.

A seconda delle impostazioni internazionali correnti, un numero intero superiore a 3 cifre può essere convertito in una stringa di 4 cifre, aggiungendo un separatore di migliaia aggiuntivo.

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

Quindi consiglio vivamente di usare il std::to_stringmodo. È più facile e fa quello che ti aspetti.

Aggiornato (vedi commenti sotto) :

C ++ 17 fornisce std::to_charsun'alternativa indipendente dalle impostazioni locali a prestazioni più elevate


2
Sono d'accordo che questo è un problema serio se è necessario scambiare dati. Sfortunatamente, std::to_stringusa anche le impostazioni internazionali correnti (vedi en.cppreference.com/w/cpp/string/basic_string/to_string , la sezione 'Note'). Quasi tutti gli strumenti standard (dai flussi di stringhe a sprintf, ma anche sscanfecc.) Utilizzano le impostazioni internazionali correnti. Non ne ero a conoscenza fino a poco tempo fa quando mi ha colpito duramente. Attualmente sto usando cose coltivate in casa, non difficili da realizzare.
Bert Bril,

Nel link sopra è anche statet che C ++ 17 fornisce std :: to_chars come alternativa indipendente dalla locale ad alte prestazioni.

Sfortunatamente, sono bloccato con C ++ 11 per i prossimi anni (un bel miglioramento già, per fortuna).
Bert Bril,

1
from_chars e to_chars sarebbero perfetti ma sfortunatamente non offrivano una variante di wchar_t.
gast128,

8

Per C ++ 98 , ci sono alcune opzioni:

boost/lexical_cast

Boost non fa parte della libreria C ++, ma contiene molte utili estensioni di libreria.

Il lexical_castmodello di funzione offre una forma comoda e coerente per supportare conversioni comuni da e verso tipi arbitrari quando sono rappresentati come testo.
- Documentazione di 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;
}

Per quanto riguarda il runtime, l' lexical_castoperazione richiede circa 80 microsecondi (sulla mia macchina) sulla prima conversione, quindi accelera notevolmente dopo se eseguita in modo ridondante.


itoa

Questa funzione non è definita in ANSI-C e non fa parte di C ++, ma è supportata da alcuni compilatori.
- cplusplus.com

Ciò significa che gcc/ g++non è possibile compilare il codice utilizzando 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;
}

Nessun runtime da segnalare. Non ho installato Visual Studio, che secondo quanto riferito è in grado di compilare itoa.


sprintf

sprintf è una funzione di libreria standard C che funziona su stringhe C ed è un'alternativa perfettamente valida.

Composta una stringa con lo stesso testo che verrebbe stampato se il formato fosse usato su printf, ma invece di essere stampato, il contenuto viene memorizzato come stringa C nel buffer puntato da 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;
}

L' stdio.hintestazione potrebbe non essere necessaria. Per quanto riguarda il runtime, l' sprintfoperazione richiede circa 40 microsecondi (sulla mia macchina) sulla prima conversione, quindi accelera notevolmente dopo se eseguita in modo ridondante.


stringstream

Questo è il modo principale della libreria C ++ di convertire numeri interi in stringhe e viceversa. Esistono funzioni sorelle simili a quelle stringstreamche limitano ulteriormente l'uso previsto del flusso, come ad esempio ostringstream. L'uso ostringstreamspecifico indica al lettore del codice che si intende utilizzare l' <<operatore, in sostanza. Questa funzione è tutto ciò che è particolarmente necessario per convertire un numero intero in una stringa. Vedi questa domanda per una discussione più elaborata.

#include <sstream>
#include <string>

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

Per quanto riguarda il runtime, l' ostringstreamoperazione richiede circa 71 microsecondi (sulla mia macchina), quindi accelera considerevolmente in seguito se eseguita in modo ridondante, ma non tanto quanto le funzioni precedenti .


Ovviamente ci sono altre opzioni e puoi persino includerne una nella tua funzione, ma ciò offre uno sguardo analitico ad alcune di quelle popolari.


Grazie per
A. B

@AB Non riesco a credere che ci siano ancora utenti C ++ 98.
Kotauskas,

@VladislavToncharov Quando il tuo compito è solo quello di supportare apparecchiature e codice legacy, ti immergi nella roba vecchia utilizzando standard di settore più freschi. Un'estate fa, stavo scrivendo codice in Python 2.3.
Joshua Detwiler,

@JoshuaDetwiler Oh, me ne sono dimenticato, scusa.
Kotauskas,

4

C ++ 17 fornisce std :: to_chars come alternativa indipendente dalla locale a prestazioni più elevate.


3

È piuttosto facile aggiungere dello zucchero sintattico che consente di comporre le stringhe al volo in un modo simile a un flusso

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

Ora puoi aggiungere ciò che vuoi (a condizione che << (std::ostream& ..)sia definito un operatore ) strmake()e usarlo al posto di un std::string.

Esempio:

#include <iostream>

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

2

MODIFICATO. Se hai bisogno di una conversione veloce di un numero intero con un numero fisso di cifre in char * con riempimento a sinistra con '0' , questo è l'esempio per le architetture little-endian (tutte x86, x86_64 e altre):

Se stai convertendo un numero a due cifre:

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

Se stai convertendo un numero di tre cifre:

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

Se stai convertendo un numero di 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 di sette cifre. In questo esempio nè un dato intero. Dopo la conversione è possibile accedere alla rappresentazione della stringa come (char*)&s:

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

NOTA: se ne hai bisogno in ordine di byte big-endian, anche se non l'ho testato, ma ecco un esempio: per un numero a tre cifre è int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;per numeri a quattro cifre (arco a 64 bit): int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;penso che dovrebbe funzionare.


2
Che dire dell'ordine dei byte?
shjeff,

Questo comportamento indefinito non è dovuto all'alias del puntatore?
Dgnuff,

1
@shjeff grazie per il commento, ho aggiunto una nota sull'endianness alla risposta.
Alek,

@dgnuff grazie per averlo sottolineato, anche se non ho avuto problemi con questo, hai ragione. Ho leggermente modificato la risposta in modo che rispetti le regole di aliasing rigorose, grazie.
Alek,

1

Uso:

#define convertToString(x) #x

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

3
Funziona solo con numeri letterali, non valuta il contenuto variabile, sebbene utile a volte.
Lupo,

Giusto. Ma sicuramente utile al momento
maverick9888,

1
Funziona solo in fase di compilazione con numeri di costanti letterali, penso che l'OP richieda una conversione dinamica, usando numeri interi variabili
Ing. Gerardo Sánchez,

0

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 g ++ per Windows e Linux.


0

Ecco un altro modo semplice per farlo

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

sprintf è noto per inserire qualsiasi dato in una stringa del formato richiesto.

È possibile convertire un char *array in una stringa come mostrato nella terza riga.


0

Questo ha funzionato per me -

Il mio codice:

#include <iostream>
using namespace std;

int main()
{
    int n = 32;
    string s = to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}

Usando essenzialmente cosa? stringstream?
Peter Mortensen,

@PeterMortensen Guarda attentamente, èstd::to_string()
Kotauskas,

ho using namespace std;:)
Gonçalo Garrido,

0

C ++ 11 introdotto std::to_string()per tipi numerici:

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

4
Ciao! Potresti aggiungere una spiegazione sul perché e come questo fornisce una risposta alla domanda?
nodo il

0

Uso:

#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
Fallisce completamente per 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
Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato a breve termine. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Toby Speight,

Completamente fallisce per n≤0
Toby Speight

Aggiungi commenti, spiega la tua risposta, leggi come rispondere .
Aksen P

-1

Se si utilizza MFC , è possibile utilizzare CString:

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

8
Si dovrebbe notare che questo è un Microsoft-unica estensione: msdn.microsoft.com/en-us/library/ms174288.aspx
JonnyJD

1
Adoro l'idea di CString :: Format (). Peccato che non solo MS portatile.
Nick,

1
Ho aggiornato la mia risposta per includere le informazioni del tuo commento @JonnyJD, dal momento che continuo a subire il voto negativo per questo 5 anni dopo ..
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
perde la memoria, -1 da me
paulm

Questo puzza di sovraccarico del buffer.
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));
    }
}

Ora puoi usare to_string(5).


10
Mentre questa soluzione funziona, è altamente scoraggiata! I nomi che iniziano con il trattino basso e la lettera maiuscola sono riservati al compilatore, non dovresti mai usarli. Iniettare funzioni nello stdspazio dei nomi non è nemmeno qualcosa che dovresti mai fare. Inoltre, non sembra _MAX_INT_DIGuna macro standard, quindi se è definita in modo errato, questo codice ha il grande potenziale di indurre comportamenti indefiniti. -1
iFreilicht

6
Che cos'è _MAX_INT_DIG e perché viene raddoppiato?
paulm

-2

Penso che usare stringstreamsia abbastanza semplice:

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

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

Questo è stato menzionato nella domanda e purtroppo è piuttosto lento.
Kotauskas,

-3

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

  • Prendi il numero intero e prendi ogni cifra che è ponderata per potenze di 10. Quindi supponi che il numero intero sia 950.

    • Se il numero intero è uguale o maggiore di 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. Rilascia un altro potere di dieci.

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

  • Rilascia un altro potere di dieci

  • Ripeti lo schema

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


Non è molto utile descrivere un algoritmo, piuttosto che mostrare un esempio nel codice.
cdeerinck,
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.