diff --git a/conversions/c_atoi_str_to_integer.c b/conversions/c_atoi_str_to_integer.c new file mode 100644 index 00000000..e16c7774 --- /dev/null +++ b/conversions/c_atoi_str_to_integer.c @@ -0,0 +1,80 @@ +/** + * \file + * \brief Recoding the original atoi function in stdlib.h + * \author [Mohammed YMIK](https://github.com/medymik)W + * The function convert a string passed to an integer + */ +#include +#include +#include +#include + +/** + * the function take a string and return an integer + * \param[out] str pointer to a char address + */ +int c_atoi(const char *str) +{ + int i; + int sign; + long value; + long prev; + + i = 0; + sign = 1; + value = 0; + + /* skipping the spaces */ + while (((str[i] <= 13 && str[i] >= 9) || str[i] == 32) && str[i] != '\0') + i++; + + /* store the sign if it is negative sign */ + if (str[i] == '-' || str[i] == '+') + (str[i++] == '-') ? sign = -1 : 1; + + /* converting char by char to a numeric value */ + while (str[i] >= 48 && str[i] <= 57 && str[i] != '\0') + { + prev = value; + value = value * 10 + sign * (str[i] - '0'); + + /* managing the overflow */ + if (sign == 1 && prev > value) + return (-1); + else if (sign == -1 && prev < value) + return (0); + i++; + } + return (value); +} + +/** + * test the function implementation + */ +int test_c_atoi() +{ + printf("<<<< TEST FUNCTION >>>>\n"); + assert(c_atoi("123") == atoi("123")); + assert(c_atoi("-123") == atoi("-123")); + assert(c_atoi("") == atoi("")); + assert(c_atoi("-h23") == atoi("-h23")); + assert(c_atoi(" 23") == atoi(" 23")); + assert(c_atoi("999999999999") == atoi("999999999999")); + printf("<<<< TEST DONE >>>>\n"); +} + + +/** + * the main function take one argument of type char* + * example : ./program 123 + */ +int main(int argc, char **argv) +{ + if (argc == 2) + { + printf("Your number + 5 is %d\n", c_atoi(argv[1]) + 5); + return (0); + } + printf("wrong number of parmeters\n"); + return (1); +}