Segmentation Fault на сайте codeeval - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Короче, товарищи... Выполнял сегодня задание, называется Fibonacci Series. Суть его в том, что надо из фала принять два числа 5 и 12, которые обозначают порядковые номера чисел Фибоначчи, а выводим мы результат (5 и 144) ещё в один файл, если я всё правильно понял... Ну, если что на сайте гляньте https://www.codeeval.com/open_challenges/22/ Вот что я натворил и у меня всё работает, кстати!
#include <stdio.h>

int main(int argc, const char * argv[])
{
    // открываем файлы
    FILE *input = fopen("input.csv", "r");
    FILE *output = fopen("out.txt", "w");
    int fibo[20];//в массиве будет только 20 чисел Фибоначчи
    int n; // это число будет означать элемент в массиве
    fibo[0] = 0; //для удобства рассчётов вводим первый и второй элемент чисел Фибоначчи
    fibo[1] = 1;
    for(n=2; n<=20; n++){ //заполняем массив числами
        fibo[n] = fibo[n-1]+fibo[n-2];
    }
    
    while(!feof(input)){ // загружаем в новый файл построчно до скончания файла
        fscanf(input, "%i\n", &n);
        fprintf(output, "%i\n", fibo[n]);
    }
    fclose(input);
    fclose(output);
 
    return 0;
}
И вот их компиллятор на сайте который выдаёт segmentation fault. В чём фишка?

Решение задачи: «Segmentation Fault на сайте codeeval»

textual
Листинг программы
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    FILE *input, *output;
    // открываем файлы
    if (argc > 1)
        input = fopen(argv[1], "r");
    else
        input = freopen(NULL, "r", stdin);
 
    if (argc > 2)
        output = fopen(argv[2], "w");
    else
        output = freopen(NULL, "w", stdout);
 
    int fibo[20];//в массиве будет только 20 чисел Фибоначчи
    int n; // это число будет означать элемент в массиве
    fibo[0] = 0; //для удобства рассчётов вводим первый и второй элемент чисел Фибоначчи
    fibo[1] = 1;
    for(n=2; n<20; n++){ //заполняем массив числами
        fibo[n] = fibo[n-1]+fibo[n-2];
    }
    
    while(fscanf(input, "%i\n", &n) == 1) {
        if (n >= 0 && n < 20)
            fprintf(output, "%i\n", fibo[n]);
        else
            fprintf(output, "-1\n");
    }
    fclose(input);
    fclose(output);
 
    return 0;
}

Объяснение кода листинга программы

В этом коде на языке C считываются два аргумента командной строки, которые являются именами файлов. Первый файл открывается для чтения, второй — для записи. Затем определяется массив fibo размером 20 для хранения чисел Фибоначчи. Изначально в массиве уже содержатся первые два числа Фибоначчи (0 и 1), чтобы облегчить расчеты. Затем в цикле заполняется остальная часть массива числами Фибоначчи. Далее, пока вводимом файле есть данные, считывается число N (которое должно быть в пределах от 0 до 19, включительно). Если число в пределах допустимого диапазона, то в выходной файл записывается соответствующее число Фибоначчи. Если число выходит за пределы допустимого диапазона, то в выходной файл записывается -1. В конце программы файлы закрываются, и возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5