#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 ввести Ctrl—Z (— в DOS / Windows), прежде чем ваша программа выйдет из while
цикла.