Verwendung von die std::stod-Funktionsfamilie in C++

Jinku Hu 12 Oktober 2023
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Function