Converti String in Int in C++

Jinku Hu 12 ottobre 2023
  1. Usa il metodo std::stoi per convertire la stringa in Int in C++
  2. Usa il metodo std::from_chars per convertire la stringa in Int in C++
Converti String in Int in C++

Questo articolo introduce diversi metodi per convertire string in int in C++.

Usa il metodo std::stoi per convertire la stringa in Int in C++

Il metodo stoi è una caratteristica del contenitore string incorporata per la conversione in un intero con segno. Il metodo accetta un parametro obbligatorio del tipo string su cui operare. Potremmo anche passare alcuni parametri opzionali come la posizione iniziale nella stringa e la base numerica. Il seguente codice di esempio mostra più scenari di input string e i corrispondenti casi di utilizzo di stoi.

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

Produzione:

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

Si noti che stoi può gestire caratteri di spazi bianchi iniziali, segni +/-, prefissi esadecimali (0x o 0X), anche più zeri e restituire il numero intero correttamente. Non può gestire altri caratteri prima delle cifre e, se ne trova uno, viene lanciata l’eccezione std::invalid_argument. Puoi vedere il comportamento con il seguente codice di esempio:

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

Produzione:

num1: 123
stoi caused the error!!!

Esistono diversi metodi di stile stoi per convertire in diversi tipi di numeri come: std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod, std::stold che può essere utilizzato per implementare funzionalità specifiche secondo necessità.

Usa il metodo std::from_chars per convertire la stringa in Int in C++

Il metodo from_chars è un’aggiunta C++ 17 alla libreria utilities, definita nel file di intestazione <charconv>. Può analizzare sequenze di caratteri con modelli specificati. Il vantaggio di ciò è un tempo di elaborazione molto più rapido e una migliore gestione delle eccezioni nei casi di analisi non riuscita. Sebbene ci siano alcune restrizioni sulla stringa di input, vale a dire: spazi bianchi iniziali/altri caratteri, anche i prefissi di base 16 0x/0X non possono essere gestiti. Solo il segno meno iniziale viene riconosciuto per gli interi con segno.

Sintassi di std::from_chars

from_chars(const char* first, const char* last, TYPE& value, int base = 10)
Parametro Descrizione
[first, last) intervallo di indirizzi dei caratteri da analizzare
value la variabile del risultato analizzato se ha esito positivo
base Base int. L’impostazione predefinita è 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;
}

Produzione:

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
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++ String

Articolo correlato - C++ Integer