Cómo analizar la Int desde la cadena en C++

Jinku Hu 12 octubre 2023
  1. Usa la función std::stoi para analizar la int de la cadena
  2. Usa la función std::from_chars para analizar la int de la cadena
Cómo analizar la Int desde la cadena en C++

Este artículo explicará varios métodos de cómo analizar una int de la cadena en C++.

Usa la función std::stoi para analizar la int de la cadena

La función stoi es parte de la biblioteca de cadenas definida en el encabezado string, y puede ser utilizada para convertir valores de cadenas a diferentes tipos numéricos. std::stoi, std::stol y std::stoll se utilizan para la conversión de enteros con signo. La función stoi toma un solo objeto string como argumento obligatorio, pero el programador también puede especificar la dirección para almacenar el entero y la base numérica en la que la cadena de entrada tiene que ser procesada.

El siguiente ejemplo muestra múltiples casos de uso de la función stoi. Observe que stoi puede manejar espacios en blanco en la cadena, pero cualquier otro carácter causará una excepción 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;
}

Resultado:

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

Usa la función std::from_chars para analizar la int de la cadena

Como alternativa, la función from_chars de la biblioteca de utilidades puede analizar los valores int. Ha sido parte de la biblioteca estándar desde la versión C++17 y está definida en el archivo de cabecera <charconv>.

Muy diferente de la stoi, from_chars opera en los rangos de caracteres, sin tener en cuenta la longitud del objeto y los bordes. Por lo tanto, el programador debe especificar el inicio y el final del rango como los dos primeros argumentos. El tercer argumento es la variable int a la que se asignará el valor convertido.

Sin embargo, from_chars sólo puede manejar el signo principal - en la cadena de entrada; por lo tanto, imprime valores de basura de num5 y num6 en el siguiente ejemplo.

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

Resultado:

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

Artículo relacionado - C++ Integer