Analizzare un int da una stringa in C++

Jinku Hu 12 ottobre 2023
  1. Usa la funzione std::stoi per analizzare l’int dalla stringa
  2. Usa la funzione std::from_chars per analizzare l’int dalla stringa
Analizzare un int da una stringa in C++

Questo articolo spiegherà diversi metodi su come analizzare un int da una stringa in C++.

Usa la funzione std::stoi per analizzare l’int dalla stringa

La funzione stoi fa parte della libreria di stringhe definita nell’intestazione string e può essere utilizzata per convertire i valori delle stringhe in diversi tipi numerici. std::stoi, std::stol e std::stoll sono usati per la conversione di interi con segno. La funzione stoi accetta un singolo oggetto string come argomento obbligatorio, ma il programmatore può anche specificare l’indirizzo per memorizzare il numero intero e la base numerica in cui la stringa di input deve essere elaborata.

L’esempio seguente mostra più casi d’uso della funzione stoi. Nota che stoi può gestire gli spazi bianchi iniziali nella stringa, ma qualsiasi altro carattere causerà un’eccezione 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;
}

Produzione:

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

Usa la funzione std::from_chars per analizzare l’int dalla stringa

In alternativa, la funzione from_chars dalla libreria delle utilità può analizzare i valori int. Fa parte della libreria standard sin dalla versione C++ 17 ed è definito nel file di intestazione <charconv>.

Molto diverso da stoi, from_chars opera sugli intervalli di caratteri, non essendo a conoscenza della lunghezza e dei bordi dell’oggetto. Pertanto, il programmatore deve specificare l’inizio e la fine dell’intervallo come primi due argomenti. Il terzo argomento è la variabile int a cui verrà assegnato il valore convertito.

Attenzione però, from_chars può gestire solo il segno - iniziale nella stringa di input; quindi stampa i valori spazzatura di num5 e num6 nell’esempio seguente.

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

Produzione:

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

Articolo correlato - C++ Integer