Verwendung von die std::stod-Funktionsfamilie in C++
Dieser Artikel erklärt und demonstriert verschiedene Methoden zur Verwendung der std::stod
-Funktionsfamilie in C++.
Verwenden Sie std::stod
, um einen string
in einen Gleitkommawert in C++ umzuwandeln
Die Funktion std::stod
wird zusammen mit std::stof
und std::stold
von STL bereitgestellt, um eine Umwandlung von string
in Gleitkommazahlen durchzuführen. Beachten Sie, dass wir Konvertierung sagen, aber es ist eher eine Interpretation des String-Inhalts als Gleitkommawert. Diese Funktionen scannen nämlich die gegebenen string
-Argumente mit vordefinierten Parsing-Regeln, um die gültigen Gleitkommazahlen zu identifizieren und sie im entsprechenden Typobjekt zu speichern.
Funktionen werden durch das Suffix unterschieden, das den von ihnen zurückgegebenen Typ angibt. Das Objekt std::stod
gibt den Wert double
zurück, std::stof
gibt einen Float zurück und std::stold
gibt long double
zurück. Diese Funktionen sind seit C++11 Bestandteil von STL und in der Headerdatei <string>
enthalten.
In den folgenden Codeausschnitten unten werden wir verschiedene Konvertierungsszenarien untersuchen und uns mit den Parsing-Regeln dieser Funktionen befassen. Das erste Beispiel ist der einfachste Fall, wenn das Objekt string
nur Ziffern und Dezimaltrennzeichen (.
) enthält. Die Funktion std::stod
interpretiert die angegebenen Zeichenketten als gültige Gleitkommazahlen und speichert sie im Typ double
ab. Beachten Sie, dass das Dezimaltrennzeichen nicht das Komma(,
)-Zeichen sein darf, da es nicht als Teil der Zahl betrachtet wird.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "123.0";
string str2 = "0.123";
auto m1 = std::stod(str1);
auto m2 = std::stod(str2);
cout << "std::stod(\"" << str1 << "\") is " << m1 << endl;
cout << "std::stod(\"" << str2 << "\") is " << m2 << endl;
return EXIT_SUCCESS;
}
Ausgabe:
std::stod("123.0") is 123
std::stod("0.123") is 0.123
Alternativ, wenn wir string
-Objekte haben, bei denen Ziffern mit anderen Zeichen gemischt werden, können zwei häufige Fälle herausgegriffen werden. Das erste Szenario: Das Objekt string
beginnt mit Ziffern, gefolgt von den anderen Zeichen; die Funktion std::stod
extrahiert die Anfangsziffern, bevor das erste nicht-stellige Zeichen (ohne Dezimaltrennzeichen) gefunden wird.
Das zweite Szenario: Das Argument string
beginnt mit nicht-stelligen Zeichen, in diesem Fall löst die Funktion die Ausnahme std::invalid_argument
aus und kann die Konvertierung nicht durchführen.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str3 = "123.4 with chars";
string str4 = "chars 1.2";
auto m3 = std::stod(str3);
// auto m4 = std::stod(str4);
cout << "std::stod(\"" << str3 << "\") is " << m3 << endl;
return EXIT_SUCCESS;
}
Ausgabe:
std::stod("123.0") is 123
std::stod("0.123") is 0.123
Im Allgemeinen verwerfen std::stod
und seine Funktionsfamilie die anfänglichen Whitespace-Zeichen. Wenn wir also einen String mit mehreren führenden Leerzeichen gefolgt von den Ziffern übergeben, wird die Konvertierung erfolgreich durchgeführt, wie im folgenden Beispiel gezeigt.
Zusätzlich können diese Funktionen ein optionales Argument vom Typ size_t*
annehmen, das bei erfolgreichem Aufruf die Anzahl der verarbeiteten Zeichen speichert. Beachten Sie, dass die führenden Leerzeichen auch zählen, wenn die Zeichenkette in die gültige Gleitkommazahl umgewandelt wird.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str3 = "123.4 with chars";
string str5 = " 123.4";
size_t ptr1 = -1;
size_t ptr2 = -1;
auto m4 = std::stod(str3, &ptr1);
auto m5 = std::stod(str5, &ptr2);
cout << m4 << " - characters processed: " << ptr1 << endl;
cout << "std::stod(\"" << str5 << "\") is " << m5 << " - " << ptr2
<< " characters processed" << endl;
cout << "length: " << str5.size() << endl;
return EXIT_SUCCESS;
}
Ausgabe:
123.4 - characters processed: 5
std::stod(" 123.4") is 123.4 - 16 characters processed
length: 16
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook