Parsen von Zeichenketten in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion std::stoi zum Parsen eines int aus einem String
  2. Verwenden Sie die Funktion std::from_chars, um Int von einer Zeichenkette zu parsen
Parsen von Zeichenketten in C++

In diesem Artikel werden mehrere Methoden zum Parsen eines int aus der Zeichenkette in C++ erläutert.

Verwendung von die Funktion std::stoi zum Parsen eines int aus einem String

Die Funktion stoi ist Teil der Zeichenkettenbibliothek, die im string-Header definiert ist, und sie kann verwendet werden, um Zeichenkettenwerte in verschiedene numerische Typen zu konvertieren. Die Funktionen std::stoi, std::stol und std::stoll werden für die Konvertierung vorzeichenbehafteter Ganzzahlen verwendet. Die Funktion stoi nimmt ein einzelnes String-Objekt als obligatorisches Argument, aber der Programmierer kann auch die Adresse zum Speichern der Ganzzahl und die Zahlenbasis angeben, in der der eingegebene String verarbeitet werden soll.

Das folgende Beispiel demonstriert mehrere Anwendungsfälle der Funktion stoi. Beachten Sie, daß stoi mit führenden Leerzeichen in der Zeichenkette umgehen kann, aber jedes andere Zeichen eine std::invalid_argument-Ausnahme verursacht.

#include <charconv>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::stoi;
using std::string;

int main() {
  string s1 = "333";
  string s2 = "-333";
  string s3 = "333xio";
  string s4 = "01011101";
  string s5 = "    333";
  string s6 = "0x33";

  int num1, num2, num3, num4, num5, num6;

  num1 = stoi(s1);
  num2 = stoi(s2);
  num3 = stoi(s3);
  num4 = stoi(s4, nullptr, 2);
  num5 = stoi(s5);
  num6 = stoi(s6, nullptr, 16);

  cout << "num1: " << num1 << " | num2: " << num2 << endl;
  cout << "num3: " << num3 << " | num4: " << num4 << endl;
  cout << "num5: " << num5 << " | num6: " << num6 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

num1: 333 | num2: -333
num3: 333 | num4: 93
num5: 333 | num6: 51

Verwenden Sie die Funktion std::from_chars, um Int von einer Zeichenkette zu parsen

Als Alternative kann die from_chars-Funktion aus der Utilities-Bibliothek int-Werte parsen. Sie ist seit der C++17-Version Teil der Standardbibliothek und ist in der <charconv> Header-Datei definiert.

Ganz anders als die stoi arbeitet from_chars mit den Zeichenbereichen, ohne sich der Objektlänge und der Grenzen bewusst zu sein. Daher sollte der Programmierer den Anfang und das Ende des Bereichs als die ersten beiden Argumente angeben. Das dritte Argument ist die Variable int, der der konvertierte Wert zugewiesen wird.

Beachten Sie jedoch, daß from_chars nur das führende - Zeichen in der Eingabezeichenkette verarbeiten kann; daher gibt es im folgenden Beispiel Abfallwerte von num5 und num6 aus.

#include <charconv>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::from_chars;
using std::stoi;
using std::string;

int main() {
  string s1 = "333";
  string s2 = "-333";
  string s3 = "333xio";
  string s4 = "01011101";
  string s5 = "    333";
  string s6 = "0x33";

  int num1, num2, num3, num4, num5, num6;

  from_chars(s1.c_str(), s1.c_str() + s1.length(), num1);
  from_chars(s2.c_str(), s2.c_str() + s2.length(), num2);
  from_chars(s3.c_str(), s3.c_str() + s3.length(), num3);
  from_chars(s4.c_str(), s4.c_str() + s4.length(), num4, 2);
  from_chars(s5.c_str(), s5.c_str() + s5.length(), num5);
  from_chars(s6.c_str(), s6.c_str() + s6.length(), num6);

  cout << "num1: " << num1 << " | num2: " << num2 << endl;
  cout << "num3: " << num3 << " | num4: " << num4 << endl;
  cout << "num5: " << num5 << " | num6: " << num6 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

num1: 333 | num2: -333
num3: 333 | num4: 93
num5: -1858679306 | num6: 0
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++ Integer