Реализация atoi - ошибка сегментации при увеличении переменной j - PullRequest
2 голосов
/ 25 февраля 2020

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

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

Мне не разрешено использовать встроенную библиотеку pow, поэтому я сам ее реализовал. Программа работает только тогда, когда входная строка имеет значения, равные единицам или десяткам, например: 5, 56 или 28 и т. Д. c. но не работает ни для какого числа сотнями или выше. (я начал получать ошибки сегмента, как только добавил 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;
}

1 Ответ

6 голосов
/ 25 февраля 2020

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

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

и

for (int i = 0; i < exponent; i++)
...