Реализация atoi — ошибка сегментации при увеличении переменной j

Программа C начинается с сохранения строкового ввода, представляющего собой число: «134», и сохраняет каждый символ в массив символов. Затем он начинается с последнего символа массива «4», а затем умножается на 10 ^ 0, затем следующий элемент умножается на 10 ^ 1 и так далее...

Пример: сумма = (4 * 10 ^ 0) + (3 * 10 ^ 1) + (1 * 10 ^ 2)

Мне не разрешено использовать встроенную библиотеку pow, поэтому я реализовал ее сам. Программа работает только тогда, когда входная строка состоит из единиц или десятков, например: 5, 56, 28 и т. д., но не работает для любого числа в сотнях или выше. (Я начал получать сообщения об ошибках seg в тот момент, когда добавил j++)

#include <stdio.h>
int pow(int, int);
int i;
int result;
#define SIZE 10
char input[SIZE];
int j = 0;

int main(){
    printf("Enter a word of positive number or quit: ");
    scanf("%s", input);
    int sum = 0;
    for(i = strlen(input)-1; i >= 0; i--){
        printf("pow: %d\n", (input[i] - '0') * pow(10, j));
        sum = sum + ((input[i] - '0') * pow(10,j));
        printf("sum: %d\n", sum);
        j++;
        printf("j: %d\n", j);
    }
    printf("%d\n", sum); 
}

int pow(int base, int exponent){
    if(exponent == 0) return 1;
    if(exponent == 1) return base;
    result = 1;
    for(i = 0; i < exponent; i++){
        result = result * base;
    }
    return result;
}

person DreamVision2017    schedule 25.02.2020    source источник
comment
Какие именно входные данные не работают для вас?   -  person Eugene Sh.    schedule 25.02.2020
comment
Вместо того, чтобы объявлять каждую переменную глобальной, объявляйте их для каждой функции там, где это необходимо. i, i, input переменные принадлежат main. result принадлежит pow.   -  person Everyone    schedule 25.02.2020
comment
Вы можете обрабатывать цифры, начиная со старшего конца, умножая значение на 10, а затем добавляя значение следующей цифры... экономит построение степеней 10. (Умножение на 10 также может быть реализовано как небольшое число сдвигает и добавляет, хотя полное умножение в наши дни быстрее.)   -  person Chris Hall    schedule 25.02.2020
comment
Все глобальные переменные могут и должны быть удалены - это плохая практика. И этот алгоритм излишне сложен. strlen() и pow() можно исключить, и в этом случае вам даже не нужен буфер input, вы можете использовать getchar() для обработки одного символа за раз. 32-битный int может содержать до 10 десятичных цифр, поэтому здесь SIZE слишком мал - если вам приходится иметь дело со знаком +/-, вам также понадобится дополнительный символ для этого.   -  person Clifford    schedule 26.02.2020
comment
@ChrisHall Умножение на 10 также может быть реализовано как небольшое количество смен и добавляет верно, но хороший компилятор сделает это уже в sum = sum*10 + (input[i] - '0');, если он действительно лучше. Лучше всего позволить компилятору сделать эту оптимизацию или получить лучший компилятор.   -  person chux - Reinstate Monica    schedule 26.02.2020


Ответы (1)


Вы объявили i глобальной переменной. Затем он используется как итератор как в main(), так и в pow(), что нежелательно. Это можно исправить, сделав итератор локальным для области цикла, как

for (int i = strlen(input)-1; i >= 0; i--)

и

for (int i = 0; i < exponent; i++)
person GoodDeeds    schedule 25.02.2020