Comment analyser une chaîne de caractères en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction std::stoi pour analyser une int à partir d’une chaîne de caractères
  2. Utilisez la fonction std::from_chars pour analyser la chaîne de caractères Int From String
Comment analyser une chaîne de caractères en C++

Cet article explique plusieurs méthodes d’analyse d’un int à partir de la string en C++.

Utilisez la fonction std::stoi pour analyser une int à partir d’une chaîne de caractères

La fonction stoi fait partie de la bibliothèque de chaînes de caractères définie dans l’en-tête string, et elle peut être utilisée pour convertir les valeurs des chaînes de caractères en différents types numériques. Les fonctions std::stoi, std::stol et std::stoll sont utilisées pour la conversion d’entiers signés. La fonction stoi prend un seul objet string comme argument obligatoire, mais le programmeur peut aussi spécifier l’adresse pour stocker l’entier et la base de nombres dans laquelle la chaîne d’entrée doit être traitée.

L’exemple suivant montre plusieurs cas d’utilisation de la fonction stoi. Notez que la fonction stoi peut gérer les espaces blancs de tête dans la chaîne, mais tout autre caractère provoquera une exception std::invalid_argument.

#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;
}

Production :

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

Utilisez la fonction std::from_chars pour analyser la chaîne de caractères Int From String

Comme alternative, la fonction from_chars de la bibliothèque d’utilitaires peut analyser les valeurs int. Elle fait partie de la bibliothèque standard depuis la version C++17 et est définie dans le fichier d’en-tête <charconv>.

Très différente de la fonction stoi, from_chars opère sur les plages de caractères, sans tenir compte de la longueur et des limites de l’objet. Ainsi, le programmeur doit spécifier le début et la fin de la plage comme étant les deux premiers arguments. Le troisième argument est la variable int à laquelle la valeur convertie sera assignée.

Attention cependant, from_chars ne peut gérer que le signe - de tête dans la chaîne de caractères d’entrée ; c’est pourquoi il imprime les valeurs de num5 et num6 dans l’exemple suivant.

#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;
}

Production :

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

Article connexe - C++ Integer