Segmentation Fault на сайте codeeval - C (СИ)
Формулировка задачи:
#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 на сайте codeeval»
#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, что означает успешное выполнение программы.