Programa C++ para escribir su propio atoi()

La función atoi() en C toma una string (que representa un número entero) como argumento y devuelve su valor de tipo int. Entonces, básicamente, la función se usa para convertir un argumento de string en un número entero.

Sintaxis:  

int atoi(const char strn)

Parámetros: la función acepta un parámetro strn que se refiere al argumento de string que se necesita convertir en su equivalente entero.

Valor devuelto: si strn es una entrada válida, la función devuelve el número entero equivalente para el número de string pasado. Si no tiene lugar una conversión válida, la función devuelve cero.

Ejemplo: 

C++

#include <bits/stdc++.h>
using namespace std;
  
int main()
{
    int val;
    char strn1[] = "12546";
  
    val = atoi(strn1);
    cout <<"String value = " << strn1 << endl;
    cout <<"Integer value = " << val << endl;
  
    char strn2[] = "GeeksforGeeks";
    val = atoi(strn2);
    cout <<"String value = " << strn2 << endl;
    cout <<"Integer value = " << val <<endl;
  
    return (0);
}
  
// This code is contributed by shivanisinghss2110
Producción

String value = 12546
Integer value = 12546
String value = GeeksforGeeks
Integer value = 0

Ahora comprendamos varias formas en las que uno puede crear su propia función atoi() compatible con varias condiciones:

Enfoque 1: a continuación se muestra una implementación simple de la conversión sin considerar ningún caso especial. 

  • Inicializar el resultado como 0.
  • Comience desde el primer carácter y actualice el resultado para cada carácter.
  • Para cada carácter actualice la respuesta como resultado = resultado * 10 + (s[i] – ‘0’)

C++

// A simple C++ program for
// implementation of atoi
#include <bits/stdc++.h>
using namespace std;
  
// A simple atoi() function
int myAtoi(char* str)
{
    // Initialize result
    int res = 0;
  
    // Iterate through all characters
    // of input string and update result
    // take ASCII character of corresponding digit and
    // subtract the code from '0' to get numerical
    // value and multiply res by 10 to shuffle
    // digits left to update running total
    for (int i = 0; str[i] != ''; ++i)
        res = res * 10 + str[i] - '0';
  
    // return result.
    return res;
}
  
// Driver code
int main()
{
    char str[] = "89789";
    
    // Function call
    int val = myAtoi(str);
    cout << val;
    return 0;
}
  
// This is code is contributed by rathbhupendra
Producción

89789

Enfoque 2: esta implementación maneja los números negativos. Si el primer carácter es ‘-‘, almacene el signo como negativo y luego convierta el resto de la string en número utilizando el enfoque anterior mientras multiplica el signo con él. 

C++

// A C++ program for
// implementation of atoi
#include <bits/stdc++.h>
using namespace std;
  
// A simple atoi() function
int myAtoi(char* str)
{
    // Initialize result
    int res = 0;
  
    // Initialize sign as positive
    int sign = 1;
  
    // Initialize index of first digit
    int i = 0;
  
    // If number is negative,
    // then update sign
    if (str[0] == '-') {
        sign = -1;
  
        // Also update index of first digit
        i++;
    }
  
    // Iterate through all digits
    // and update the result
    for (; str[i] != ''; i++)
        res = res * 10 + str[i] - '0';
  
    // Return result with sign
    return sign * res;
}
  
// Driver code
int main()
{
    char str[] = "-123";
  
    // Function call
    int val = myAtoi(str);
    cout << val;
    return 0;
}
  
// This is code is contributed by rathbhupendra
Producción

-123

Enfoque 3: esta implementación maneja varios tipos de errores . Si str es NULL o str contiene caracteres no numéricos, devuelva 0 porque el número no es válido. 

Producción

 -134

Enfoque 4: Se deben manejar cuatro casos de esquina: 

  • Descarta todos los espacios en blanco iniciales
  • Signo del número
  • Desbordamiento
  • Entrada inválida

Para eliminar los espacios en blanco iniciales, ejecute un ciclo hasta que se alcance un carácter del dígito. Si el número es mayor o igual a INT_MAX/10. Luego devuelva INT_MAX si el signo es positivo y devuelva INT_MIN si el signo es negativo. Los otros casos se manejan en enfoques anteriores. 

Ejecución en seco: 

A continuación se muestra la implementación del enfoque anterior: 

C++

// A simple C++ program for
// implementation of atoi
#include <bits/stdc++.h>
using namespace std;
  
int myAtoi(const char* str)
{
    int sign = 1, base = 0, i = 0;
      
    // if whitespaces then ignore.
    while (str[i] == ' ') 
    {
        i++;
    }
      
    // sign of number
    if (str[i] == '-' || str[i] == '+') 
    {
        sign = 1 - 2 * (str[i++] == '-');
    }
    
    // checking for valid input
    while (str[i] >= '0' && str[i] <= '9') 
    {
        // handling overflow test case
        if (base > INT_MAX / 10
            || (base == INT_MAX / 10 
            && str[i] - '0' > 7)) 
        {
            if (sign == 1)
                return INT_MAX;
            else
                return INT_MIN;
        }
        base = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}
  
  
// Driver Code
int main()
{
    char str[] = "  -123";
    
    // Functional Code
    int val = myAtoi(str);
    cout <<" "<< val;
    return 0;
}
  
// This code is contributed by shivanisinghss2110
Producción

 -123

Análisis de complejidad para todos los enfoques anteriores: 

  • Complejidad temporal: O(n). 
    Solo se necesita un recorrido de la string.
  • Complejidad espacial: O(1). 
    Como no se requiere espacio adicional.

Programa recursivo para atoi() .

Ejercicio: 
Escriba su won atof() que toma una string (que representa un valor de punto flotante) como argumento y devuelve su valor como doble.

Consulte el artículo completo sobre Escriba su propio atoi() para obtener más detalles.

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 *