Я вижу здесь несколько ошибок.
- Если вы хотите преобразовать символ ASCII в соответствующее целое число, вам нужно вычесть '0'.Посмотрите на таблицу ASCII: например, «7» отображается с десятичным значением 55. Следовательно, если вы хотите получить 7, вам нужно вычесть ASCII из «0», что равно 48 (55 - 48 = 7):
int foo = str[i] - '0';
В самом последнем цикле while my_atoi .Значение индексированного числового представления строки рассчитывается путем умножения значения str [i] с числовым значением base на степень индекса , начиная с .
Например, давайте посмотрим на «1337»:
7*10^0 + 3*10^1 + 3*10^2 + 1*10^3 = 7 + 30 + 300 + 1000 = 1337
Как видите, 7 имеет числовой индекс 0 и так далее.Предполагая, что вы хотите просто игнорировать шиба ваш код будет выглядеть что-то , например:
#include <stdio.h>
#include <string.h>
// Return base^(exponent)
int my_pow(int base, unsigned int exponent)
{
if (exponent == 0) {
return 1;
} else {
int result = base;
for (int i = 1; i < exponent; i++) {
result *= base;
}
return result;
}
}
int my_atoi(char *str, size_t len)
{
int i;
int res;
int sign;
i = 0;
res = 0;
sign = 1;//sign of '-' or '+'
while(str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
{
i++;
}
if(str[i] == '-')
{
sign = -1;
i++;
}
else if(str[i] == '+')
{
sign = 1;
i++;
}
// Store the index where the number string starts
int j = i-1;
// Find the ending index of the number string
i = len;
while (str[i] < '0' || str[i] > '9') {
i--;
}
int num_end = i;
// Now start at the ending
while(i > j)
{
if (str[i] >= '0' && str[i] <= '9') {
res += my_pow(10, num_end-i) * (str[i] - '0');
} else {
// If a character unequal to a digit is found then skip it
num_end--;
}
i--;
}
return(res * sign);// to make integer which has value of '-' or '+'
}
int main(void)
{
char str[] = "-2018shiba";
printf("%d\n", my_atoi(str, strlen(str)));
char str2[] = "-20X18shiba";
printf("%d\n", my_atoi(str2, strlen(str2)));
return(0);
}