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

Jinku Hu 12 octobre 2023
  1. Utilisez la méthode std::stoi pour convertir une chaîne de caractères en Int en C++
  2. Utilisez la méthode std::from_chars pour convertir une chaîne de caractères en Int en C++
Comment convertir une chaîne de caractères en Int en C++

Cet article présente plusieurs méthodes pour convertir une chaîne en int en C++.

Utilisez la méthode std::stoi pour convertir une chaîne de caractères en Int en C++

La méthode “stoï” est une fonction intégrée de conteneur de chaîne pour la conversion en un entier signé. La méthode prend un paramètre obligatoire du type chaîne pour fonctionner. On peut aussi passer des paramètres optionnels comme la position de départ dans la chaîne et la base de nombres. L’exemple de code suivant montre plusieurs scénarios de saisie de chaîne et les cas d’utilisation correspondants de “stoï”.

#include <iostream>
#include <string>

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

int main() {
  string s1 = "123";
  string s2 = "-123";
  string s3 = "123xyz";
  string s4 = "-123xyz";
  string s5 = "7B";
  string s6 = "-7B";
  string s7 = "1111011";
  string s8 = "-1111011";

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

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

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

  return EXIT_SUCCESS;
}

Production:

num1: 123 | num2: -123
num3: 123 | num4: -123
num5: 123 | num6: -123
num7: 123 | num8: -123

Remarquez que stoi peut gérer les espaces, les signes +/-, les préfixes hexadécimaux (0x ou 0X), même les zéros multiples et retourner l’entier correctement. Il ne peut pas gérer d’autres caractères avant les chiffres, et s’il en trouve un, l’exception std::invalid_argument est lancée. Vous pouvez voir le comportement avec l’exemple de code suivant:

#include <iostream>
#include <string>

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

int main() {
  string s1 = "   123";
  ;
  string s2 = "xyz123";
  ;
  int num1, num2;

  num1 = stoi(s1);
  cout << "num1: " << num1 << endl;
  try {
    num2 = stoi(s2);
    cout << "num2: " << num2 << endl;
  } catch (std::exception& e) {
    cout << e.what() << " caused the error!!!\n";
  }

  return EXIT_SUCCESS;
}

Production:

num1: 123
stoi caused the error!!!

Il existe plusieurs méthodes de style stoi pour convertir en différents types de nombres comme : std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod, std::stold qui peuvent être utilisées pour implémenter des fonctionnalités spécifiques selon les besoins.

Utilisez la méthode std::from_chars pour convertir une chaîne de caractères en Int en C++

La méthode from_chars est un ajout C++17 à la bibliothèque utilities, définie dans le fichier d’en-tête <charconv>. Elle peut analyser des séquences de caractères avec des motifs spécifiés. L’avantage de cette méthode est un temps de traitement beaucoup plus rapide et une meilleure gestion des exceptions dans les cas d’analyse ratée. Bien qu’il y ait certaines restrictions sur la chaîne de caractères d’entrée, à savoir : les espaces de tête/autres caractères, même les préfixes de base 16 0x/0X ne peuvent pas être traités. Seul le signe moins en tête est reconnu pour les entiers signés.

Syntaxe de std::from_chars (en anglais)

from_chars(const char* first, const char* last, TYPE& value, int base = 10)
Paramètre Description
[first, last) plage d’adresses de caractères à analyser
value la variable du résultat de l’analyse syntaxique en cas de succès
base base “in”. La valeur par défaut est 10.
#include <charconv>
#include <iostream>
#include <string>

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

int main() {
  string s1 = "123";
  string s2 = "-123";
  string s3 = "123xyz";
  string s4 = "-123xyz";
  string s5 = "7B";
  string s6 = "-7B";
  string s7 = "1111011";
  string s8 = "-1111011";
  string s9 = "    123";
  string s10 = "x123";

  int num1, num2, num3, num4, num5, num6, num7, num8, num9, num10;

  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);
  from_chars(s5.c_str(), s5.c_str() + s5.length(), num5, 16);
  from_chars(s6.c_str(), s6.c_str() + s6.length(), num6, 16);
  from_chars(s7.c_str(), s7.c_str() + s7.length(), num7, 2);
  from_chars(s8.c_str(), s8.c_str() + s8.length(), num8, 2);
  from_chars(s9.c_str(), s9.c_str() + s9.length(), num9);
  from_chars(s10.c_str(), s10.c_str() + s10.length(), num10);

  cout << "num1: " << num1 << " | num2: " << num2 << endl;
  cout << "num3: " << num3 << " | num4: " << num4 << endl;
  cout << "num5: " << num5 << " | num6: " << num6 << endl;
  cout << "num7: " << num7 << " | num8: " << num8 << endl;
  cout << "num9: " << num9 << " | num10: " << num10 << endl;

  return EXIT_SUCCESS;
}

Production:

num1: 123 | num2: -123
num3: 123 | num4: -123
num5: 123 | num6: -123
num7: 123 | num8: -123
num9: -16777216 | num10: -1 // incorrect values varying over runs
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++ String

Article connexe - C++ Integer