¿Cuál es el algoritmo utilizado para convertir cadenas en enteros?

El algoritmo es bastante simple. El lenguaje agnóstico sería:

total = 0 base <- input_base
para cada caracter en la entrada:
total <- total * base + número (char)

En C ++:

// Ayudante para convertir un dígito en un número

número int sin signo (char ch)
{
if (ch> = ‘0’ && ch <= '9')
return ch-‘0 ‘;
ch = toupper (ch);
if (ch> = ‘A’ && ch <= 'F')
devuelve ch-‘A ‘;
}
unsigned int parse (std :: string const & input, unsigned int base)
{
unsigned int total = 0;
para (int i = 0; i <input.size (); ++ i)
{
total = total * base + número (entrada [i]); } retorno total;
}

Por supuesto, debe ocuparse de posibles errores (entrada incoherente: base 2 y cadena de entrada ‘af12’) o cualquier otra condición excepcional.

Como no ha especificado ningún idioma en el que desee implementar esto, iré con Java y Python .

Aquí hay un método en Java que devuelve una representación entera de una String que se le pasa, y [math] -1 [/ math] si falla la coincidencia de tipos:

private static int test_me (cadena de cadena)
{
if (! string.matches (“\\ d +”))
volver -1;

char [] array = string.toCharArray ();

int longitud = array.length;
int número = 0;

para (int i = longitud – 1; i> = 0; – i)
número + =
Math.pow (10, longitud – i – 1)
* (matriz [i] – 48);

número de retorno;
}

Lo que este método realmente hace es verificar si la String entrada es numérica o no, mediante el uso de la expresión regular \\d+ , no procede en ese caso y devuelve [math] -1 [/ math].

En caso de que pase la verificación, continúa, crea una matriz de caracteres de la String , y para cada carácter c , se multiplica (c - 48) con [math] 10 [/ math] elevado a la potencia de su índice para administrar el sistema de valor posicional.

¡Pan comido!

Y así es como en Python ( number , el argumento de test_me , es una Cadena aquí), que se comporta más o menos de la misma manera que su contraparte Java:

importación re;

def test_me (número):
patrón = re.compile (“\\ d +”);

si no pattern.match (número):
volver -1;

suma = 0;
longitud = len (número);

para i en rango (longitud – 1, -1, -1):
suma + = (10 ** (longitud – i – 1))
* (ord (número [i]) – 48);

suma de retorno;


Ambos idiomas le brindan las herramientas necesarias para completar el trabajo de fábrica.

Así es como en Java (asegurándose de manejar los casos de esquina también usando el manejo de excepciones; la representación entera se devuelve en caso de que la String string sea ​​realmente una, [math] -1 [/ math] de lo contrario):

clase pública StringToInteger {

public static void main (String [] args) {
Cadena [] matriz = {“321”, “cba”};

para (Cadena de cadena: matriz)
System.out.println (test_me (cadena));
}

private static Integer test_me (Cadena de cadena)
{
Entero entero = -1;

tratar
{
entero = Integer.parseInt (cadena);
}

catch (NumberFormatException nfe)
{
entero = -1;
}

retorno entero;
}
}

Salida:

321
-1

Y así es como en Python:

def test_me (número):
n = -1;

tratar:
n = int (número);
excepto:
n = -1;
finalmente:
volver n;

lista = [“123”, “abc”];

para la cadena en la lista:
print (test_me (cadena));

Salida:

123
-1

Java tiene su Integer.parseInt() para convertir un objeto String en un entero y NumberFormatException para administrar la situación en caso de que NumberFormatException , y Python tiene su método int() que impone la conversión de tipos a un entero.


Espero que haya ayudado.

La función int atoi (const char * str); convierte una cadena en un entero (int) . La función omite todos los caracteres de espacio en blanco al comienzo de la cadena hasta que se encuentre el primer carácter que no sea un espacio en blanco. Luego convierte los siguientes caracteres en un número entero hasta que encuentra un carácter que no es un dígito. También toma un signo opcional más o menos inicial antes del primer dígito de base 10 en la cadena.

#include
#include
int main () {
cadena de caracteres [100];
valor int;
printf (“Ingrese una cadena \ n”);
scanf (“% s”, & cadena);
/ * Conversión de cadena a entero * /
valor = atoi (cadena);
printf (“Valor entero% d \ n”, valor);
devuelve 0;
}

podemos convertir una cadena a entero sin usar la función atoi. Primero verificamos que inputString [0] es ‘-‘ o no para identificar números negativos. Luego convertimos cada carácter numérico (‘0’ a ‘9’) en un dígito equivalente y lo agrega al entero convertido. Luego multiplicamos el entero convertido con -1 o 1 en función de si la cadena de entrada contiene un número negativo o positivo. Finalmente, imprime el entero en la pantalla usando la función printf.

Primer enlace cuando buscas en Google:

Cadena C a Int: formas simples de convertir a valores numéricos

Aquí hay una implementación de la función C atoi (). ¡Espero eso ayude!

#include
#include
#include
#include

int atoi (const char * s)
{
largo r = 0L, d;
signo de char = ‘+’;

si (s == 0)
devuelve 0; / * no se pudo realizar la conversión * /
while (* s && isspace (* s))
++ s; / * pasar los espacios iniciales * /
if (* s == ‘\ 0’)
devuelve 0; / * no se pudo realizar la conversión * /
signo = (* s == ‘+’ || * s == ‘-‘)? * s ++: ‘+’;
if (isdigit (* s) == 0)
devuelve 0; / * no se pudo realizar la conversión * /
while (isdigit (* s))
{
d = * s – ‘0’;
if (r> (INT_MAX – d) / 10)
{
/ * fuera de rango para un entero * /
errno = ERANGE;
volver (signo == ‘+’)? INT_MAX: INT_MIN;
}
más
r = r * 10L + d;
}
volver (signo == ‘+’)? (int) r: (int) (-r);
}

/* FIN DEL DOCUMENTO */