После каждого сканирования указатель файла остается на завершающей новой строке ввода. После сканирования последней строки ввода и присвоения значений b, c и d, getchar
в то время как l oop читает последний символ новой строки. Тогда scanf не читает никаких значений, поэтому b, c и d не изменяются. Значения, которые были оставлены от предыдущего l oop, присваиваются массиву, i увеличивается, а затем getchar возвращает EOF и разрывы l oop. Всегда проверяйте значение, возвращаемое scanf. Другими словами, эта проблема испаряется, если вы используете обычную идиому
while(scanf(" %c%d%d%d",&a,&b,&c,&d) == 4) { ...
Кроме того, в этом случае ошибка была бы замечена легче, если бы вы не копировали данные без необходимости во временные переменные. B , c, и d, но только что сделал:
while( scanf(" %c%d%d%d", &a, arr + 3*i, arr + 3*i +1, arr + 3*i + 2) == 4
, что было бы написано более четко как:
int *base = arr;
while( scanf(" %c%d%d%d", &a, base, base + 1, base + 2) == 4 ) {
base += 3; ...
Обратите внимание, что во всех них a
действительно должен быть объявлен как символ, но для присвоения a
из getchar
необходимо, чтобы a
было int
, и это должно быть подсказкой, что попытка использовать getchar/ungetc
является ошибкой.
Подводя итог, можно сказать, что на всех входных строках, кроме первой, getchar
читает '\ n', ungetc
выталкивает эту новую строку обратно в буфер, а затем scanf
пропускает ее из-за начальных пробелов в строка формата.