Implementar la función atoi() en C | iterativo y recursivo
Escribe una función eficiente para implementar atoi()
función en C. El estándar atoi()
La función convierte la string C de entrada a su valor entero correspondiente.
Implementación iterativa de atoi()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <stdio.h> // Función iterativa para implementar la función `atoi()` en C long atoi(const char* S) { long num = 0; int i = 0; // corre hasta que se alcanza el final de la string, o el // el carácter actual no es numérico while (S[i] && (S[i] >= '0' && S[i] <= '9')) { num = num * 10 + (S[i] - '0'); i++; } return num; } // Implementar la función `atoi()` en C int main(void) { char S[] = "12345"; printf("%ld ", atoi(S)); return 0; } |
Resultado:
12345
Implementación recursivo de atoi()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <stdio.h> #include <string.h> // Función recursivo para implementar la función `atoi()` en C long atoi(const char *S, int n) { // caso base: se alcanza el final de la string, o el // el carácter actual no es numérico if (n < 0 || (S[n] < '0' || S[n] > '9')) { return 0; } // recurre para los dígitos restantes y agrega el dígito actual // al resultado de la recursividad multiplicado por 10 return (10 * atoi(S, n - 1) + (S[n] - '0')); } // Implementar la función `atoi()` en C int main(void) { char S[] = "12345"; printf("%ld", atoi(S, strlen(S) - 1)); return 0; } |
Resultado:
12345
Las implementaciones iterativas y recursivos anteriores de atoi()
no es similar a la implementación estándar de atoi(). La función primero debe descartar la mayor cantidad de caracteres de espacio en blanco hasta que se encuentre el primer carácter que no sea un espacio en blanco. Luego, a partir de este carácter, toma un signo más o menos inicial opcional, seguido de tantos dígitos de base 10 como sea posible, y los interpreta como un valor numérico. La string, si contiene caracteres adicionales después de los que forman el número entero, se ignoran. No se realiza ninguna conversión si la string está vacía o solo contiene caracteres de espacio en blanco y se devuelve cero. Siguiendo atoi()
La implementación se encarga de todo esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <stdio.h> // Función iterativa para implementar la función `atoi()` en C long atoi(const char S[]) { long num = 0; int i = 0, sign = 1; // salta los espacios en blanco while (S[i] == ' ' || S[i] == '\n' || S[i] == '\t') { i++; } // nota el signo del número if (S[i] == '+' || S[i] == '-') { if (S[i] == '-') { sign = -1; } i++; } // corre hasta que se alcanza el final de la string, o el // el carácter actual no es numérico while (S[i] && (S[i] >= '0' && S[i] <= '9')) { num = num * 10 + (S[i] - '0'); i++; } return sign * num; } // Implementar la función `atoi()` en C int main(void) { char S[] = " -1234567890"; printf("%ld ", atoi(S)); return 0; } |
Resultado:
-1234567890
La complejidad temporal de todas las soluciones anteriores es O(n), dónde n
es la longitud de la string de entrada.
de eso se trata atoi()
implementacion en c