как использовать EOF stdin в C

#c #stdin #scanf #feof

#c #стандартный файл #scanf #feof

Вопрос:

Мне нужно вводить координаты в массив до тех пор, пока не встретится EOF, но что-то не так в моем коде. Я использовал ctrl Z, ctrl D

 int main()
{
    int x[1000],y[1000];
    int n=0,nr=0,a,b,i;
    printf("Enter the coordinates:n");
    while(scanf ( "%d %d ", amp;a, amp;b) == 2)
    {
     x[n]=a;
     y[n]=b;
     n  ;
    }
    if (!feof(stdin))
    {
       printf("Wrongn");
    }
    else
    {
       for(i=0;i<n;i  )
       printf("%d %dn", x[i], y[i]);
    }

  return 0;
}
  

Комментарии:

1. Всегда печатается неправильно?

Ответ №1:

Я предлагаю использовать

 while(!feof(stdin) amp;amp; scanf ( "%d %d ", amp;a, amp;b) == 2)
  

и на самом деле лучше тестировать feof после (не раньше!) некоторой операции ввода, поэтому:

 while (scanf("%d %d ", amp;a, amp;b) == 2 amp;amp; !feof(stdin))
  

Кстати, во многих системах stdin буферизуется строка, по крайней мере, с интерактивными терминалами (но, возможно, не тогда, когда stdin является каналом (7)), см. setvbuf(3)

В Linux и POSIX вы могли бы рассмотреть возможность чтения каждой строки с помощью getline(3) (или даже с помощью readline(3) при чтении с терминала, поскольку readline предоставляет возможности редактирования), а затем проанализировать эту строку, например, с помощью sscanf(3) (возможно, также используя %n ) или strtol (3)

Ответ №2:

Единственная реальная проблема, которую я вижу в вашем коде, — это лишние пробелы в scanf строке формата. Эти пробелы указывают scanf на использование пробельного символа при вводе, что заставляет scanf не возвращаться к вашему коду, пока он не встретит символ, не содержащий пробела (такой как буква, цифра, знак препинания или EOF).

Результатом является то, что после ввода двух чисел, а затем Enter вам нужно CtrlдваждыD ввести CtrlZ ( в DOS / Windows), прежде чем ваша программа выйдет из while цикла.