Я пытаюсь реализовать функцию 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);
}
Не могли бы вы проверить, почему это произошло?
pow(10, 2)
округляет до 99 на вашей платформе (особенно плохаяpow
реализация) - person Antti Haapala   schedule 29.06.2017atoi
, так как оно конфликтует со стандартной библиотечной функцией — вы должны назвать ее по-другому. Кроме того, возвращайте значение с помощьюreturn count;
, не сохраняйте его в глобальной переменной. - person Antti Haapala   schedule 29.06.2017power
является статическим состоянием... - ваш второй вызовatoi
завершится ошибкой - person Antti Haapala   schedule 29.06.2017if(*next != '\0' && next != NULL){
и второй тестnext != NULL
. Если быnext was
NULL, the prior
*next`, вероятно, это вызвало бы проблемы, такие как уничтожение программы. IOWs, тест был слишком запоздалым. - person chux - Reinstate Monica   schedule 29.06.2017malloc
- идеальный пример (atoi
- плохой пример). Возможно, это не очень умная идея, но она разрешена (или должна быть разрешена) и в основном поддерживается использованием символовweak
в стандартной библиотеке. - person Myst   schedule 29.06.2017atoi
явно даже не совместим с существующим. - person Antti Haapala   schedule 29.06.2017atoi
даже не возвращаетint
- это всеa
безi
, так что это, вероятно, сломает любую стандартную функцию (например,printf
, которая используетatoi
внутри... :-) - person Myst   schedule 29.06.2017