рекурсивная реализация atoi

Я пытаюсь реализовать функцию atoi в C. Однако всякий раз, когда я использую тестовую строку «856», результирующее целое число будет 855. Я пробовал много тестовых случаев, но результат будет таким же (например, «4756» -> 4755) . Ниже код - мое неправильное решение.

#include <math.h>
#include <stdio.h>
int count = 0;
void atoi(char * str){
    static int power = 0;
    char * next = str;
    next++;
    if(*next != '\0' && next != NULL){
        atoi(next);
        power++;
        //printf("%f\n",((*str) - '0') * pow(10, power)); 
        count += ((*str) - '0') * pow(10, power);
    }
    else{
        //printf("%f\n",((*str) - '0') * pow(10, power));
        count += ((*str) - '0') * pow(10, power);
    }
}
int main(){
    char * string = (char *)malloc(sizeof(char)*3);
    string = "457";
    atoi(string);
    printf("%d",count);
}

Не могли бы вы проверить, почему это произошло?


person Rebec    schedule 28.06.2017    source источник
comment
Вы используете функцию pow. Не. Вместо этого умножьте множитель на 10...   -  person Antti Haapala    schedule 29.06.2017
comment
т.е. pow(10, 2) округляет до 99 на вашей платформе (особенно плохая pow реализация)   -  person Antti Haapala    schedule 29.06.2017
comment
Кроме того, вам не разрешено определять свою собственную функцию с именем atoi, так как оно конфликтует со стандартной библиотечной функцией — вы должны назвать ее по-другому. Кроме того, возвращайте значение с помощью return count;, не сохраняйте его в глобальной переменной.   -  person Antti Haapala    schedule 29.06.2017
comment
Кроме того, ваш алгоритм не работает должным образом рекурсивно, поскольку power является статическим состоянием... - ваш второй вызов atoi завершится ошибкой   -  person Antti Haapala    schedule 29.06.2017
comment
Примечание: рассмотрим if(*next != '\0' && next != NULL){ и второй тест next != NULL. Если бы next was NULL, the prior *next`, вероятно, это вызвало бы проблемы, такие как уничтожение программы. IOWs, тест был слишком запоздалым.   -  person chux - Reinstate Monica    schedule 29.06.2017
comment
@AnttiHaapala - обычная практика скрывать стандартные библиотечные функции с оптимизированными реализациями ... malloc - идеальный пример (atoi - плохой пример). Возможно, это не очень умная идея, но она разрешена (или должна быть разрешена) и в основном поддерживается использованием символов weak в стандартной библиотеке.   -  person Myst    schedule 29.06.2017
comment
@Myst это специально указано как неопределенное поведение в стандарте C. Естественно, если бы вы заменили его полностью совместимой реализацией, то он мог бы просто работать. Здесь - даже нет, потому что atoi явно даже не совместим с существующим.   -  person Antti Haapala    schedule 29.06.2017
comment
@AnttiHaapala Я не знал, что это неопределенное поведение. Моя память, должно быть, играет со мной злую шутку в последнее время. Я посмотрю. И да, OP atoi даже не возвращает int - это все a без i, так что это, вероятно, сломает любую стандартную функцию (например, printf, которая использует atoi внутри... :-)   -  person Myst    schedule 29.06.2017
comment
@Myst Все идентификаторы с внешней связью в любом из следующих подразделов зарезервированы для использования в качестве идентификаторов с внешней связью, если какой-либо из них используется программой. Ни один из них не зарезервирован, если ни один из них не используется. и J.2. говорит Программа объявляет или определяет зарезервированный идентификатор, отличный от разрешенного [7.1.3 или 7.1.4]   -  person Antti Haapala    schedule 29.06.2017
comment
@АнттиХаапала, спасибо!   -  person Myst    schedule 29.06.2017