Escribe tu 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

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    int val;
    char strn1[] = "12546";
 
    val = atoi(strn1);
    printf("String value = %s\n", strn1);
    printf("Integer value = %d\n", val);
 
    char strn2[] = "GeeksforGeeks";
    val = atoi(strn2);
    printf("String value = %s\n", strn2);
    printf("Integer value = %d\n", val);
 
    return (0);
}
Producción

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

Complejidad de tiempo: O(n) donde n es la longitud de la string

Espacio Auxiliar: O(1)

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] != '\0'; ++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

C

// Program to implement atoi() in C
#include <stdio.h>
 
// 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] != '\0'; ++i)
        res = res * 10 + str[i] - '0';
 
    // return result.
    return res;
}
 
// Driver Code
int main()
{
    char str[] = "89789";
   
    // Function call
    int val = myAtoi(str);
    printf("%d ", val);
    return 0;
}

Java

// A simple Java program for
// implementation of atoi
class GFG {
 
    // A simple atoi() function
    static int myAtoi(String 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; i < str.length(); ++i)
            res = res * 10 + str.charAt(i) - '0';
 
        // return result.
        return res;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "89789";
       
         
        // Function call
        int val = myAtoi(str);
        System.out.println(val);
    }
}
 
// This code is contributed by PrinciRaj1992

Python3

# Python program for implementation of atoi
 
# A simple atoi() function
 
 
def myAtoi(string):
    res = 0
 
    # Iterate through all characters of
    #  input string and update result
    for i in range(len(string)):
        res = res * 10 + (ord(string[i]) - ord('0'))
 
    return res
 
 
# Driver program
string = "89789"
 
# Function call
print (myAtoi(string))
 
# This code is contributed by BHAVYA JAIN

C#

// A simple C# program for implementation
// of atoi
using System;
 
class GFG {
 
    // A simple atoi() function
    static int myAtoi(string str)
    {
        int res = 0; // Initialize result
 
        // 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; i < str.Length; ++i)
            res = res * 10 + str[i] - '0';
 
        // return result.
        return res;
    }
 
    // Driver code
    public static void Main()
    {
        string str = "89789";
       
        // Function call
        int val = myAtoi(str);
        Console.Write(val);
    }
}
 
// This code is contributed by Sam007.

Javascript

<script>
// A simple Javascript program for
// implementation of atoi
 
// A simple atoi() function
function myAtoi(str)
{
    // Initialize result
        let 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 (let i = 0; i < str.length; ++i)
            res = res * 10 + str[i].charCodeAt(0) - '0'.charCodeAt(0);
  
        // return result.
        return res;
}
 
// Driver code
let str = "89789";
        
          
// Function call
let val = myAtoi(str);
document.write(val);
 
 
// This code is contributed by rag2127
</script>
Producción

89789

Complejidad de tiempo: O(n) donde n es la longitud de la string str.

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] != '\0'; 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

C

// A C program for
// implementation of atoi
#include <stdio.h>
 
// 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] != '\0'; ++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);
    printf("%d ", val);
    return 0;
}

Java

// Java program for
// implementation of atoi
class GFG {
 
    // A simple atoi() function
    static 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 (; i < str.length; ++i)
            res = res * 10 + str[i] - '0';
 
        // Return result with sign
        return sign * res;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char[] str = "-123".toCharArray();
       
        // Function call
        int val = myAtoi(str);
        System.out.println(val);
    }
}
 
// This code is contributed by 29AjayKumar

Python3

# Python program for implementation of atoi
 
# A simple atoi() function
 
 
def myAtoi(string):
    res = 0
    # initialize sign as positive
    sign = 1
    i = 0
 
    # if number is negative then update sign
    if string[0] == '-':
        sign = -1
        i += 1
 
    # Iterate through all characters
    # of input string and update result
    for j in range(i, len(string)):
        res = res*10+(ord(string[j])-ord('0'))
 
    return sign * res
 
 
# Driver code
string = "-123"
 
# Function call
print (myAtoi(string))
 
# This code is contributed by BHAVYA JAIN

C#

// C# program for implementation of atoi
using System;
 
class GFG {
 
    // A simple atoi() function
    static int myAtoi(string 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 (; i < str.Length; ++i)
            res = res * 10 + str[i] - '0';
 
        // Return result with sign
        return sign * res;
    }
 
    // Driver code
    public static void Main()
    {
        string str = "-123";
       
        // Function call
        int val = myAtoi(str);
        Console.Write(val);
    }
}
 
// This code is contributed by Sam007.

Javascript

<script>
 
    // JavaScript program for implementation of atoi
 
    // A simple atoi() function
    function myAtoi(str)
    {
  
        // Initialize result
        var res = 0;
  
        // Initialize sign as positive
        var sign = 1;
  
        // Initialize index of first digit
        var 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 (; i < str.length; ++i)
            res = res * 10 + str[i].charCodeAt(0) - '0'.charCodeAt(0);
  
        // Return result with sign
        return sign * res;
    }
  
      // Driver code
          var str = "-129";
          var val=myAtoi(str);
        document.write(val);
 
</script>
 <! --This code is contributed by nirajgusain5 -->
Producción

-123

Complejidad de tiempo: O(n) donde n es la longitud de la string str.

Enfoque 3: Es necesario manejar los casos de cuatro esquinas: 

  • 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

C

// A simple C++ program for
// implementation of atoi
#include <stdio.h>
#include <limits.h>
 
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);
    printf("%d ", val);
    return 0;
}
// This code is contributed by Yogesh shukla.

Java

// A simple Java program for
// implementation of atoi
class GFG {
    static int myAtoi(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++] == '-' ? 1 : 0);
        }
 
        // checking for valid input
        while (i < str.length
               && str[i] >= '0'
               && str[i] <= '9') {
 
            // handling overflow test case
            if (base > Integer.MAX_VALUE / 10
                || (base == Integer.MAX_VALUE / 10
                    && str[i] - '0' > 7))
            {
                if (sign == 1)
                    return Integer.MAX_VALUE;
                else
                    return Integer.MIN_VALUE;
            }
            base = 10 * base + (str[i++] - '0');
        }
        return base * sign;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char str[] = " -123".toCharArray();
       
        // Function call
        int val = myAtoi(str);
        System.out.printf("%d ", val);
    }
}
 
// This code is contributed by 29AjayKumar

Python3

# A simple Python3 program for
# implementation of atoi
import sys
 
def myAtoi(Str):
 
    sign, base, i = 1, 0, 0
     
    # If whitespaces then ignore.
    while (Str[i] == ' '):
        i += 1
     
    # Sign of number
    if (Str[i] == '-' or Str[i] == '+'):
        sign = 1 - 2 * (Str[i] == '-')
        i += 1
 
    # Checking for valid input
    while (i < len(Str) and
          Str[i] >= '0' and Str[i] <= '9'):
               
        # Handling overflow test case
        if (base > (sys.maxsize // 10) or
           (base == (sys.maxsize // 10) and
           (Str[i] - '0') > 7)):
            if (sign == 1):
                return sys.maxsize
            else:
                return -(sys.maxsize)
         
        base = 10 * base + (ord(Str[i]) - ord('0'))
        i += 1
     
    return base * sign
 
# Driver Code
Str = list(" -123")
 
# Functional Code
val = myAtoi(Str)
 
print(val)
 
# This code is contributed by divyeshrabadiya07

C#

// A simple C# program for implementation of atoi
using System;
 
class GFG {
    static int myAtoi(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++] == '-' ? 1 : 0);
        }
 
        // checking for valid input
        while (
            i < str.Length
            && str[i] >= '0'
            && str[i] <= '9') {
 
            // handling overflow test case
            if (Base > int.MaxValue / 10 || (Base == int.MaxValue / 10 && str[i] - '0' > 7)) {
                if (sign == 1)
                    return int.MaxValue;
                else
                    return int.MinValue;
            }
            Base = 10 * Base + (str[i++] - '0');
        }
        return Base * sign;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        char[] str = " -123".ToCharArray();
        int val = myAtoi(str);
        Console.Write("{0} ", val);
    }
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
// A simple JavaScript program for
// implementation of atoi
    function myAtoi(str)
   {
    var 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 > Number.MAX_VALUE/ 10
            || (base == Number.MAX_VALUE / 10
            && str[i] - '0' > 7))
        {
            if (sign == 1)
                return Number.MAX_VALUE;
            else
                return Number.MAX_VALUE;
        }
        base = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}
 
    // Driver code
        var str = " -123";
       
        // Function call
        var val = myAtoi(str);
        document.write(" ", val);
     
// This code is contributed by shivanisinghss2110
</script>
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.

Este artículo ha sido compilado por Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 
Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
 

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 *