Qual è il modo più breve, preferibilmente in linea, di convertire un int in una stringa? Le risposte che usano stl e boost saranno benvenute.
to_string
likestd::string s = std::to_string(42)
Qual è il modo più breve, preferibilmente in linea, di convertire un int in una stringa? Le risposte che usano stl e boost saranno benvenute.
to_string
likestd::string s = std::to_string(42)
Risposte:
È possibile utilizzare std :: to_string in C ++ 11
int i = 3;
std::string str = std::to_string(i);
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:
lexical_cast
porta, ma sento che Boost è praticamente eccessivo per questo tipo di compiti ...
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();
}
#include <sstream>
.
std::
;)
Se non è possibile utilizzare std::to_string
da 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.
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_string
sovraccarichi (si noti che per impostazione predefinita è base-10).
ostream
opere 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).
itoa()
o stricmp()
vengono fornite come risposta a qualsiasi cosa .
sprintf
posso anche raggiungere l'obiettivo dell'OP (anche se soffre ancora della mancanza di flessibilità se è necessario qualcosa di diverso dai numeri di base comuni).
La seguente macro non è così compatta come quella monouso ostringstream
o 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 ostringstream
in una generica ostream
così 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_cast
restituisce il tipo di nuovo al ostringstream
modo 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;
}
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é?
int
(il mio primo esempio). Ma senza il ostream
visibile 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.
Potresti includere l'implementazione di itoa nel tuo progetto.
Eccolo modificato per funzionare con std :: string: http://www.strudel.org.uk/itoa/
#include <string>
#include <stdlib.h>
Ecco un altro modo semplice per convertire int in stringa
int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());
puoi visitare questo link per ulteriori metodi https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
Supponiamo di averlo fatto integer = 0123456789101112
. Ora, questo numero intero può essere convertito in una stringa dalla stringstream
classe.
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;
}