Столкнулся с проблемой при проверке на ввод EOF. Либо возникает ошибка сегментирования, либо break не срабатывает для счетчика

Программа некорректно работает в структурах с проверкой на EOF. Если делаю через структуру do...while возникает "ошибка сегментирования (стек памяти сброшен на диск)", если иду через цикл for (в коде снизу он закомментирован), то для счетчика цикла не срабатывает оператор break (то есть ввод прекращается. При выводе элементов массива, до которых ввод не дошел - выводится значение инициализированное по умолчанию, но значение i выводится как 21). В чем ошибка?

То, что EOF прекращает ввод - условие задания.

Подкорректированный код

#include <stdio.h>
#define SIZE 20

double rootCalc(const double, const double, const double);

main ()
{
   double mass[SIZE]={0};
   double e, x0=1, x;
   int i=0, max;
   
   printf("Please enter 'e' value: ");
   scanf("%lf", &e);
   
   FILE *input;
   input=fopen("input", "r");
   printf("\nPlease enter value of xi (enter EOF character to end input):\n");
   for (i=0; i<21;) {
      if (fscanf(input, "%lf", &mass[i]))
         i++;
      else
         break;
   }
   
   max=i;
   
   printf("\nRoots calculation\n");
   //printf("%10s  %10s\n", "Value", "Root");
   for (i=0; i<max; i++) {
      x=mass[i];
      x=rootCalc(x, e, x0);
      printf("%-.10g  %-.10g\n", mass[i], x);
   }
   
   return 0;
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Harry
do {
   i++;
   scanf("%lf", &mass[0][i]);
}
while (mass[0][i] != (EOF));

Однако...

Кто вам сказал, что при невозможности чтения в переменной окажется -1?

while(scanf("%lf", &mass[0][i]) == 1) ++i;

P.S. Кстати, на всякий случай — что вы имеете в виду, когда пишете

enter EOF character to end input

Что именно и как именно должен ввести пользователь?

P.P.S. Вы преднамеренно начинаете считывание с элемента mas[0][1]? Так и надо?

→ Ссылка