Нужно закончить цикл если ввели пустой ряд или нажали EOF

Цикл не заканчивается при EOF, но при пустом ряде заканчивается.
В чём может быть проблема? При EOF должен закончиться немедленно.
Пробовал писать и if(a[0]==EOF) break; но ничего не меняет.

char a[50], k[50], i = 0, b[50];
a[0] = 2;
int l;
while (a[0] != EOF && a[0] != 0) {
    gets(a);
    b[i] = check(a);
    i++;
}

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

Автор решения: KoVadim

Давайте посмотрим на описание функции https://en.cppreference.com/w/c/io/gets

Там нигде не сказано, что она будет возвращать EOF в первом символе. (Если что, EOF это число, равное -1). Там просто сказано, что эта функция возвратит NULL в случае завершения/ошибки. Поэтому, этот цикл обычно переписывается вот так

while(gets(a) != NULL){
  b[i]=check(a);
  i++;
}

Да, особые ценители могут написать так

while(gets(a)){
  b[i]=check(a);
  i++;
}

(о том, что gets считается небезопасной и о том, что код сам чуточку странненький, я умолчу)

→ Ссылка