Convertir strings en números en C/C++

Convertir números en strings o viceversa es un poco confuso en sí mismo. Es posible que tengamos que realizar tales conversiones mientras trabajamos con números y strings juntos. A pesar de ser operaciones simples, muchos codificadores fallan o se confunden al hacer esto.  

Antes de saber cómo debemos convertir strings en números, ¿cuál es la necesidad de conversión? 

Obtendrá un error si intenta ingresar un valor que no es aceptable con el tipo de datos. Tanto C/C++ es un lenguaje fuertemente tipado. Obtendrá un error si intenta ingresar un valor que no es aceptable con el tipo de datos. No solo en las entradas, sino que obtendrá un error al realizar operaciones. Existe una buena posibilidad de obtener errores lógicos y de sintaxis.

Por ejemplo, supongamos que tenemos una string numérica «673» que queremos convertir a un tipo numérico. Necesitaremos utilizar una función que convierta una string en un número entero y devuelva 673 como valor numérico.

Además, convertir un texto en un número entero es más difícil que convertir dobles en números enteros mediante la conversión de tipos. No se nos permite realizar la conversión de tipos porque int y string no están en la misma jerarquía de objetos.

Por ejemplo, no puede hacer esto ya que dará error

C++

#include <string>
using namespace std;
  
int main() {
   string str = "7";
   int num;
  
   num = (int) str;
}

El error después de compilar será:

hellp.cpp:9:10: error: no hay conversión coincidente para conversión de estilo C de ‘std::__1::string’ (también conocido como
    ‘basic_string<char, char_traits<char>, allocator<char> >’) a ‘int ‘
 num = (int) str;
       ^~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:875:5: nota:
  operador de función candidato __self_view() const _NOEXCEPT { return __self_view(datos(), Talla()); }
  ^
1 error generado.

Para la conversión de números a strings, consulte el artículo : Conversión de números a strings en C++

Convertir strings en números

Existen 3 métodos principales para convertir un número en una string, que son los siguientes:

  • Usando string Stream 
  • usando stoi()
  • Usando atoi()
     

1. Usando la clase stringstream o sscanf()

stringstream(): Esta es una manera fácil de convertir strings de dígitos en números enteros, flotantes o dobles. Un flujo de números declara un objeto de flujo que primero inserta una string, como un número en un objeto, y luego usa ‘ stringstream()’ para seguir la conversión interna.

Para usarlo, primero, agregue la línea #include <sstream> al inicio de su programa para incluir la biblioteca sstream.

Luego se agrega el stringstream y se crea un objeto stringstream, que conservará el valor de la string que desea convertir a un int y se utilizará durante el proceso de conversión.

Para extraer la string de la variable de string, use el operador <<.

A continuación, ingresa el valor int recién convertido en la variable int usando el operador >>.

Ejemplo:

CPP

// C++ program to demonstrate the 
// use of a stringstream to
// convert string to int
#include <iostream>
#include <sstream>
using namespace std;
  
int main()
{
    string s = "12345";
  
    // object from the class stringstream
    stringstream geek(s);
  
    // The object has the value 12345 and stream
    // it to the integer x
    int x = 0;
    geek >> x;
  
    // Now the variable x holds the value 12345
    cout << "Value of x : " << x;
  
    return 0;
}
Producción

Value of x : 12345
// A stringstream is similar to input/output
// file stream. We need to declare a stringstream
// just like an fstream, for example: 
stringstream ss;

// and, like an fstream or cout, 
// we can write to it:
ss << myString; or 
ss << myCstring; or
ss << myInt;, or float, or double, etc.

// and we can read from it:
ss >> myChar; or
ss >> myCstring; or
ss >> myInt;  

Para resumir, stringstream es una forma conveniente de manipular strings. ‘ sscanf() es una función de estilo C similar a scanf(). Lee la entrada de una string en lugar de la entrada estándar. 

GeeksforGeeks-CPP-Foundation-Course

Sintaxis de sscanf:

int sscanf ( const char * s, const char * format, ...);

Tipo de retorno : Entero

Parámetros :

  • s : string utilizada para recuperar datos
  • formato : una string que contiene los especificadores de tipo…
  • : – Los argumentos contienen punteros para asignar almacenamiento con el tipo apropiado.

Debe haber al menos tantos de estos argumentos como el número de valores almacenados por los especificadores de formato.

En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.

C++

// C++ program to demonstrate 
// the working of SSCANF() to
// convert a string into a number
  
#include <iostream>
using namespace std;
  
int main()
{
    const char* str = "12345";
    int x;
    sscanf(str, "%d", &x);
    
    cout << "\nThe value of x : " << x << endl;
    
    return 0;
}
  
// This code is contributed by sarajadhav12052009

C

// C program to demonstrate 
// the working of SSCANF() to
// convert a string into a number
  
#include <stdio.h>
int main()
{
    const char* str = "12345";
    int x;
    sscanf(str, "%d", &x);
    printf("\nThe value of x : %d", x);
    return 0;
}
Producción

The value of x : 12345

De manera similar, podemos leer float y double usando %f y %lf respectivamente.

C

// C++ program to show how SSCANF() 
// can work with floating numbers
#include <stdio.h>
int main()
{
    const char* str = "12345.54";
    float x;
    sscanf(str, "%f", &x);
    printf("\nThe value of x : %f", x);
    return 0;
}
Producción

The value of x : 12345.540039

Salida 1:

The value of x : 12345.540039 // output of floating number

Salida 2:

The value of x : 12345.540000 // output of double number

Si los valores son los mismos, ¿por qué las salidas son diferentes?

La razón detrás de esto es que los números flotantes tienen que ver con la velocidad, la precisión y la conveniencia, además de que usan una representación binaria para mostrar su salida, lo que lleva la salida a la aproximación más cercana; es por eso que hay esos dígitos adicionales al final de la salida. Además de eso, en números dobles, el valor se mostrará tal cual porque el doble tiene que ver con la precisión y la confiabilidad, aunque consume más espacio que los números flotantes y también es un poco más lento que los números flotantes. 

2. Conversión de strings usando stoi()

stoi(): La función stoi() toma una string como argumento y devuelve su valor en forma de número entero. Este enfoque es popular en las versiones actuales de C++, y se introdujo por primera vez en C++11 . Y si observa stoi() un poco más de cerca, descubrirá querepresenta:

   s a i()

|  |   |___> integer
|  |_______> to
|__________> String 

Ejemplo:

CPP

// C++ program to demonstrate working of stoi()
// Work only if compiler supports C++11 or above
// Because STOI() was added in C++ after 2011
#include <iostream>
#include <string>
using namespace std;
  
int main()
{
    string str1 = "45";
    string str2 = "3.14159";
    string str3 = "31337 geek";
  
    int myint1 = stoi(str1); // type of explicit type casting
    int myint2 = stoi(str2); // type of explicit type casting
    int myint3 = stoi(str3); // type of explicit type casting
  
    cout << "stoi(\"" << str1 << "\") is " << myint1
         << '\n';
    cout << "stoi(\"" << str2 << "\") is " << myint2
         << '\n';
    cout << "stoi(\"" << str3 << "\") is " << myint3
         << '\n';
  
    return 0;
}
Producción

stoi("45") is 45
stoi("3.14159") is 3
stoi("31337 geek") is 31337

Salida :

stoi("45") is 45
stoi("3.14159") is 3
stoi("31337 geek") is 31337 

3. Conversión de strings usando atoi()

La función atoi() toma una array de caracteres o un literal de string como argumento y devuelve su valor en forma de número entero. Y si observa atoi() un poco más de cerca, descubrirá que significa:

a   to   i
|   |    |____> integer 
|   |_________> to
|_____________> Argument    

Ejemplo:

C++14

// C++ program to demonstrate the functioning of 
// the ATOI() function
#include <cstdlib>
#include <iostream>
using namespace std;
  
int main()
{
    const char* str1 = "42";
    const char* str2 = "3.14159";
    const char* str3 = "31337 geek";
  
    int num1 = atoi(str1); // explicit type casting
    int num2 = atoi(str2); // explicit type casting
    int num3 = atoi(str3); // explicit type casting
  
    cout << "atoi(\"" << str1 << "\") is " << num1 << '\n';
    cout << "atoi(\"" << str2 << "\") is " << num2 << '\n';
    cout << "atoi(\"" << str3 << "\") is " << num3 << '\n';
  
    return 0;
}

C

// C program to demonstrate the functioning of 
// the ATOI() function
#include <stdio.h>
#include <stdlib.h>
int main()
{
  
    char* str1 = "42";
    char* str2 = "3.14159";
    char* str3 = "31337 geek";
  
    int myint1 = atoi(str1); // explicit type casting
    int myint2 = atoi(str2); // explicit type casting
    int myint3 = atoi(str3); // explicit type casting
  
    printf("atoi(%s) is %d \n", str1, myint1);
    printf("atoi(%s) is %d \n", str2, myint2);
    printf("atoi(%s) is %d \n", str3, myint3);
  
    return 0;
}
Producción

atoi("42") is 42
atoi("3.14159") is 3
atoi("31337 geek") is 31337

stoi() frente a atoi()

1. atoi() es una función de estilo C heredada. stoi() se agrega en C++ 11. 

2. atoi() funciona solo para strings de estilo C (array de caracteres y literal de string), stoi() funciona tanto para strings de C++ como para strings de estilo C

3. atoi() toma solo un parámetro y devuelve un valor entero.

int atoi (const char * str); 

4. stoi() puede tomar hasta tres parámetros, el segundo parámetro es para el índice de inicio y el tercer parámetro es para la base del número de entrada.

int stoi (const string&  str, size_t* index = 0, int base = 10); 

Ejercicio : escriba su propio atof() que tome una string (que representa un valor de punto flotante) como argumento y devuelva su valor como doble.

C++

#include <cstdlib>
#include <iostream>
using namespace std;
  
int main()
{
    const char* str1 = "42.245";
  
    double num1 = atof(str1); // explicit type casting
    
    cout << "atof(\"" << str1 << "\") is " << num1 << '\n';
    return 0;
}
Producción

atof("42.245") is 42.245

4. Usando For Loop para convertir strings en número

C++

for ( int i = number.length() -1 ; i >= 0 ; i-- ) {
    int power = number.length() - i -1;
    newNumber += (std::pow( 10.0,  power) * (number[i] - '0'));
}

Este artículo es una contribución de Siffi Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo en write.geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *