Da diese Frage jede Woche gestellt wird, kann diese FAQ vielen Benutzern helfen.
So konvertieren Sie eine Ganzzahl in eine Zeichenfolge in C ++
So konvertieren Sie eine Zeichenfolge in C ++ in eine Ganzzahl
So konvertieren Sie eine Gleitkommazahl in eine Zeichenfolge in C ++
So konvertieren Sie eine Zeichenfolge in C ++ in eine Gleitkommazahl
Antworten:
Update für C ++ 11
Da der
C++11
Standard - String-to-Zahl - Umwandlung und umgekehrt sind in in der Standardbibliothek eingebaut. Alle folgenden Funktionen sind in<string>
(gemäß Absatz 21.5) vorhanden.Zeichenfolge zu numerisch
Jeder von diesen nimmt eine Zeichenfolge als Eingabe und versucht, sie in eine Zahl umzuwandeln. Wenn keine gültige Nummer erstellt werden konnte, z. B. weil keine numerischen Daten vorhanden sind oder die Nummer außerhalb des Bereichs für den Typ liegt, wird eine Ausnahme ausgelöst (
std::invalid_argument
oderstd::out_of_range
).Wenn die Konvertierung erfolgreich war und
idx
nicht0
,idx
enthält sie den Index des ersten Zeichens, das nicht zum Decodieren verwendet wurde. Dies könnte ein Index hinter dem letzten Zeichen sein.Schließlich ermöglichen die Integraltypen die Angabe einer Basis. Für Ziffern größer als 9 wird das Alphabet angenommen (
a=10
bisz=35
). Weitere Informationen zur genauen Formatierung, die für Gleitkommazahlen , vorzeichenbehaftete Ganzzahlen und vorzeichenlose Ganzzahlen analysiert werden kann, finden Sie hier .Schließlich gibt es für jede Funktion auch eine Überladung, die a
std::wstring
als ersten Parameter akzeptiert .numerisch zu string
Diese sind einfacher, Sie übergeben den entsprechenden numerischen Typ und erhalten eine Zeichenfolge zurück. Für Formatierungsoptionen sollten Sie zur Stringsream-Option C ++ 03 zurückkehren und Stream-Manipulatoren verwenden, wie in einer anderen Antwort hier erläutert.
Wie in den Kommentaren erwähnt, greifen diese Funktionen auf eine Standard-Mantissengenauigkeit zurück, die wahrscheinlich nicht die maximale Genauigkeit ist. Wenn für Ihre Anwendung mehr Präzision erforderlich ist, kehren Sie am besten zu anderen Formatierungsverfahren für Zeichenfolgen zurück.
Es sind auch ähnliche Funktionen definiert, die benannt
to_wstring
sind. Diese geben a zurückstd::wstring
.quelle
std::to_string
verliert viel Präzision für Gleitkommatypen.double f = 23.4323897462387526; std::string f_str = std::to_string(f);
Gibt beispielsweise eine Zeichenfolge von 23.432390 zurück. Dies macht es unmöglich, Gleitkommawerte mit diesen Funktionen zu umrunden.sprintf(buf, fmt, val)
mit einem Formatbezeichner von "% d " , "% u " , "% ld " , " generiert würde. " % lu " "% LLD" , "% LLU" , "% f" , "% f" oder "% Lf" jeweils gegebenesbuf
bezeichnet einen internen Zeichenpuffer mit ausreichender Größe. "Ich habe mir den C99- Standard für printf angesehen und denke, dass die Anzahl der Dezimalstellen von#define DECIMAL_DIG
in abhängtfloat.h .So konvertieren Sie eine Zahl in eine Zeichenfolge in C ++ 03
itoa
oder nichtitof
, da sie nicht dem Standard entsprechen und daher nicht tragbar sind.Verwenden Sie String-Streams
Beachten Sie, dass Sie Zeichenfolgenströme auch verwenden können, um Gleitkommazahlen in Zeichenfolgen umzuwandeln und die Zeichenfolge wie bei zu formatieren
cout
Sie können Stream - Manipulatoren, wie verwenden
std::endl
,std::hex
und Funktionenstd::setw()
,std::setprecision()
auf genau die gleiche Art und Weise usw. mit String - Streams wie mitcout
Nicht verwechseln
std::ostringstream
mitstd::ostrstream
. Letzteres ist veraltetVerwenden Sie die lexikalische Besetzung . Wenn Sie mit Boost nicht vertraut sind, ist es eine gute Idee, mit einer kleinen Bibliothek wie diesem lexical_cast zu beginnen. Um Boost und seine Dokumentation herunterzuladen und zu installieren, klicken Sie hier . Obwohl Boost nicht im C ++ - Standard enthalten ist, werden viele Boost-Bibliotheken irgendwann standardisiert, und Boost wird allgemein als die beste C ++ - Bibliothek angesehen.
Die lexikalische Besetzung verwendet darunter liegende Streams, daher ist diese Option im Grunde die gleiche wie die vorherige, nur weniger ausführlich.
So konvertieren Sie eine Zeichenfolge in C ++ 03 in eine Zahl
Die leichteste Option, die von C geerbt wird, sind die Funktionen
atoi
(für Ganzzahlen (alphabetisch bis ganzzahlig)) undatof
(für Gleitkommawerte (alphabetisch bis Gleitkomma)). Diese Funktionen nehmen einen C-String als Argument (const char *
) und damit ihre Nutzung kann ein nicht gerade gut C ++ Praxis berücksichtigt werden. cplusplus.com bietet eine leicht verständliche Dokumentation zu atoi und atof, einschließlich des Verhaltens bei schlechten Eingaben. Der Link enthält jedoch den Fehler, dass gemäß dem Standard das Verhalten undefiniert ist, wenn die Eingabenummer zu groß ist, um in den Zieltyp zu passen.Verwenden Sie String-Streams (diesmal geben Sie einen String-Stream ein
istringstream
). Auch hier wird istringstream genauso verwendetcin
. Auch hier nicht verwechselnistringstream
mitistrstream
. Letzteres ist veraltet.Verwenden Sie die lexikalische Besetzung .
Bei einer fehlerhaften Eingabe wird
lexical_cast
eine Ausnahme vom Typ ausgelöstboost::bad_lexical_cast
quelle
atoi
ist nicht ausgezeichnet, sie ist falsch. Es wird nicht erwähnt, dassint
das Verhalten undefiniert ist , wenn der numerische Wert der Zeichenfolge nicht dargestellt werden kann . Es heißt stattdessen, dass Werte außerhalb des Bereichs anINT_MAX
/ geklemmt werdenINT_MIN
, was ich weder in C ++ 03 noch in C89 finde. Für nicht vertrauenswürdige / nicht verifizierte Eingaben oder wenn es sich um Basen handelt, die Streams nicht unterstützen, benötigen Sie einstrtol
definiertes Fehlerverhalten. Und ähnliche Kommentare füratof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Die atoi [...] Funktionen geben den konvertierten Wert zurück." cplusplus.com ist bekanntermaßen eine unglaublich schlechte Informationsquelle für Anfänger.istr >> i1 >> f >> i2;
verfehlt dringend einen Scheck für den Erfolg.std::to_string
In C ++ 17 werden die neuen Funktionen std :: to_chars und std :: from_chars in den Header charconv eingeführt .
Von std :: to_chars , dasselbe gilt für std :: from_chars .
Obwohl es von Compilern nicht vollständig implementiert wird, wird es definitiv implementiert.
quelle
Ich habe diese praktische Klasse irgendwo hier bei StackOverflow gestohlen, um alles, was streambar ist, in einen String umzuwandeln:
Und dann benutzt du es als;
Ziemlich geschickt!
Außerdem verwende ich diese Funktion, um Zeichenfolgen in Streams zu konvertieren, obwohl dies nicht sehr sicher ist, wenn Sie versuchen, eine Zeichenfolge zu analysieren, die keine Zahl enthält. (und es ist auch nicht so klug wie das letzte)
Benutzen als:
Möglicherweise möchten Sie auch Versionen für wstrings.
quelle