Boost ist dein Freund, wenn es in Standard C ++ keine einfache Möglichkeit gibt, dies zu tun ... Ich mag natürlich, was lexical_castbringt, aber Boost ist für diese Art von Aufgaben ziemlich übertrieben ...
@ TechNyquist: Du hast recht. Nicht kompilierbar, aber geändert!
Neuro
1
Du hast also nicht gemeint, dass es kompilierbar ist, aber mit dem Include ist es tatsächlich :)
TechNyquist
1
@ TechNyquist: Ja, mit einigen std::;)
Neuro
16
Wenn Sie std::to_stringC ++ 11 nicht verwenden können, können Sie es so schreiben, wie es auf cppreference.com definiert ist:
std::string to_string( int value )
Konvertiert eine vorzeichenbehaftete Dezimalzahl in eine Zeichenfolge mit demselben Inhalt wie std::sprintf(buf, "%d", value)für einen ausreichend großen Puffer.
Implementierung
#include<cstdio>#include<string>#include<cassert>
std::string to_string(int x ){int length = snprintf( NULL,0,"%d", x );
assert( length >=0);char* buf =newchar[length +1];
snprintf( buf, length +1,"%d", x );
std::string str( buf );delete[] buf;return str;}
Sie können mehr damit machen. Verwenden Sie einfach "%g", um float oder double in string "%x"umzuwandeln , verwenden Sie , um int in hexadezimale Darstellungen umzuwandeln, und so weiter.
@ DevSolar: Sie sollten näher darauf eingehen. Das Boost-Beispiel war bereits gegeben worden. Diese Lösung ist auf den meisten Compilern verfügbar, wenn Boost nicht installiert ist (oder Ihre Anforderungen es Ihnen aus irgendeinem Grund verbieten, sie zu verwenden). Dies ostreamfunktioniert auch, bis Sie die Zahlenfolge als etwas anderes als ein Binär-, Oktal- oder Hex-Format (z. B. Basis-32) speichern müssen.
Zac Howland
3
Ich mag es nicht, wenn nicht standardmäßige Funktionen wie itoa()oder stricmp()als Antwort auf irgendetwas gegeben werden .
DevSolar
6
Es tut mir leid, Ihre Sensibilität zu verletzen, aber ich habe im ersten Satz festgestellt, dass es sich um eine nicht standardmäßige Funktion handelt. Ich habe es nicht erwähnt, sprintfkann aber auch das Ziel des OP erreichen (obwohl es immer noch unter der mangelnden Flexibilität leidet, wenn etwas anderes als die gemeinsamen Basisnummern benötigt wird).
Zac Howland
1
Ja, Sie haben es gesagt, und ich habe Ihre Antwort nicht abgelehnt, auch wenn es mich dazu juckte. Also ich denke wir sind eben. ;-)
DevSolar
8
Das folgende Makro ist nicht ganz so kompakt wie ein Einwegmakro ostringstreamoder boost::lexical_cast.
Wenn Sie jedoch wiederholt eine Konvertierung in einen String in Ihrem Code benötigen, ist dieses Makro eleganter in der Verwendung als die direkte Verarbeitung von Stringstreams oder das explizite Casting jedes Mal.
Es ist auch sehr vielseitig, da es allesoperator<<() , was von unterstützt wird , auch in Kombination konvertiert .
Definition:
#include<sstream>#define SSTR( x )dynamic_cast< std::ostringstream &>( \
( std::ostringstream()<< std::dec << x )).str()
Erläuterung:
Dies std::decist eine nebenwirkungsfreie Methode, um das Anonyme ostringstreamin ein generisches zu verwandeln, ostreamsodass die operator<<()Funktionssuche für alle Typen korrekt funktioniert. (Andernfalls treten Probleme auf, wenn das erste Argument ein Zeigertyp ist.)
Das dynamic_castgibt den Typ zurück, ostringstreamdamit Sie ihn aufrufen str()können.
Verwenden:
#include<string>int main(){int i =42;
std::string s1 = SSTR( i );int x =23;
std::string s2 = SSTR("i: "<< i <<", x: "<< x );return0;}
@rubenvb: Sie sagen mir, wie ich dies in eine Vorlage verwandeln kann, und ich werde alle C ++ - Projekte aktualisieren, in denen ich dieses Konstrukt verwendet habe.
DevSolar
@rubenvb: Sorry, das war nicht so klar wie es hätte sein sollen. Ich sehe keine Möglichkeit, wie ich daraus eine Vorlage (unter Verwendung von C ++ 98) machen könnte, ohne entweder die Fähigkeit zu verlieren, Ausgaben zu verketten (wie in meinem zweiten Beispiel) oder ein kompliziertes Durcheinander zu finden, um damit umzugehen beliebig viele Parameter und Parametertypen.
DevSolar
@ DevSolar: würde nicht inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }tun? (Noch nicht getestet, aber ich frage mich, was schief gehen würde und warum?
Rubenvb
@rubenvb: Es würde für eine Person reichen int(mein erstes Beispiel). Aber ohne die ostreamsichtbar an den Compiler in main(wie es in der Template - Funktion versteckt ist), wird es versuchen , zu sehen operator<<()für const char []in meinem zweiten Beispiel - das quaken wird. Ich weiß, dass das OP nur nach einem gefragt hat int, aber dieses allgemeinere Makro ist so nützlich (und tatsächlich ziemlich weit verbreitet), dass ich dachte, ich würde es hier aufnehmen.
DevSolar
Für die Vielseitigkeit bevorzuge ich eine Vorlagenfunktion. Für die Daisy-Chain kann das vielleicht in der gleichen Funktion mit ein bisschen RTTI gehandhabt werden ...
Neuro
2
Sie können diese Funktion verwenden, um nach dem Einfügen intin Folgendes zu konvertieren :std::string<sstream>
Sie können die Implementierung von itoa in Ihr Projekt aufnehmen.
Hier ist itoa geändert, um mit std :: string zu arbeiten: http://www.strudel.org.uk/itoa/
to_string
wiestd::string s = std::to_string(42)
Antworten:
Sie können std :: to_string in C ++ 11 verwenden
quelle
quelle
boost::lexical_cast<std::string>(yourint)
vonboost/lexical_cast.hpp
Arbeitet für alles mit std :: ostream-Unterstützung, ist aber nicht so schnell wie zum Beispiel
itoa
Es scheint sogar schneller zu sein als stringstream oder scanf:
quelle
lexical_cast
bringt, aber Boost ist für diese Art von Aufgaben ziemlich übertrieben ...Der bekannte Weg, dies zu tun, ist die Verwendung des Stream-Operators:
Natürlich können Sie es für jeden Typ mit einer Vorlagenfunktion verallgemeinern ^^
quelle
#include <sstream>
.std::
;)Wenn Sie
std::to_string
C ++ 11 nicht verwenden können, können Sie es so schreiben, wie es auf cppreference.com definiert ist:Implementierung
Sie können mehr damit machen. Verwenden Sie einfach
"%g"
, um float oder double in string"%x"
umzuwandeln , verwenden Sie , um int in hexadezimale Darstellungen umzuwandeln, und so weiter.quelle
Nicht standardmäßige Funktion, die jedoch auf den meisten gängigen Compilern implementiert ist:
Aktualisieren
C ++ 11 führte mehrere
std::to_string
Überladungen ein (beachten Sie, dass standardmäßig Base-10 verwendet wird).quelle
ostream
funktioniert auch, bis Sie die Zahlenfolge als etwas anderes als ein Binär-, Oktal- oder Hex-Format (z. B. Basis-32) speichern müssen.itoa()
oderstricmp()
als Antwort auf irgendetwas gegeben werden .sprintf
kann aber auch das Ziel des OP erreichen (obwohl es immer noch unter der mangelnden Flexibilität leidet, wenn etwas anderes als die gemeinsamen Basisnummern benötigt wird).Das folgende Makro ist nicht ganz so kompakt wie ein Einwegmakro
ostringstream
oderboost::lexical_cast
.Wenn Sie jedoch wiederholt eine Konvertierung in einen String in Ihrem Code benötigen, ist dieses Makro eleganter in der Verwendung als die direkte Verarbeitung von Stringstreams oder das explizite Casting jedes Mal.
Es ist auch sehr vielseitig, da es alles
operator<<()
, was von unterstützt wird , auch in Kombination konvertiert .Definition:
Erläuterung:
Dies
std::dec
ist eine nebenwirkungsfreie Methode, um das Anonymeostringstream
in ein generisches zu verwandeln,ostream
sodass dieoperator<<()
Funktionssuche für alle Typen korrekt funktioniert. (Andernfalls treten Probleme auf, wenn das erste Argument ein Zeigertyp ist.)Das
dynamic_cast
gibt den Typ zurück,ostringstream
damit Sie ihn aufrufenstr()
können.Verwenden:
quelle
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
tun? (Noch nicht getestet, aber ich frage mich, was schief gehen würde und warum?int
(mein erstes Beispiel). Aber ohne dieostream
sichtbar an den Compiler inmain
(wie es in der Template - Funktion versteckt ist), wird es versuchen , zu sehenoperator<<()
fürconst char []
in meinem zweiten Beispiel - das quaken wird. Ich weiß, dass das OP nur nach einem gefragt hatint
, aber dieses allgemeinere Makro ist so nützlich (und tatsächlich ziemlich weit verbreitet), dass ich dachte, ich würde es hier aufnehmen.Sie können diese Funktion verwenden, um nach dem Einfügen
int
in Folgendes zu konvertieren :std::string
<sstream>
quelle
Sie können die Implementierung von itoa in Ihr Projekt aufnehmen.
Hier ist itoa geändert, um mit std :: string zu arbeiten: http://www.strudel.org.uk/itoa/
quelle
Hier ist eine weitere einfache Möglichkeit, int in einen String umzuwandeln
Sie können diesen Link für weitere Methoden besuchen https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
quelle
Angenommen, ich habe
integer = 0123456789101112
. Jetzt kann diese Ganzzahl von derstringstream
Klasse in eine Zeichenfolge konvertiert werden .Hier ist der Code in C ++:
quelle