Как вернуть 0 при EOF

#c

Вопрос:

У меня есть программа, которая должна принимать входные данные до EOF, и поскольку это задание, я вынужден использовать scanf. Я делаю что-то подобное в основной функции:

 while (1){
    
    int x;

    int s=scanf("%d",amp;x);
    if (x==EOF){
        break;
    }

    if(s==0){
        fprintf(stderr, "Non integer value input.");
        return 1;
    }else if(something){...}
}
return 0;
 

Но если я нажму ^D, программа перейдет в бесконечный цикл вместо выхода с 0, и иногда я просто продолжаю видеть ^D на терминале. Как я могу это исправить?

Другой подход, который я попробовал, выглядел примерно так:

 char c;

    if (c==EOF){
        break;
    }
    int x=c 0;
 

PS Я также пытался выполнить while(x!=EOF) и while (!EOF) для цикла, но это тоже не работает.

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

1. EOF не является входным значением. Это возвращаемое значение из некоторых stdio функций, таких как, err, scanf() . Вы ищете его не в том месте.

2. @user207421 Я также пытался, пока(!EOF) не могли бы вы, пожалуйста, уточнить, как это сделать, так как это тоже не сработало.

3. Это имеет еще меньше смысла, и это, безусловно, не имеет ничего общего с тем, что я сказал выше. Подумайте об этом. Где вы храните возвращаемое значение scanf() ? и, следовательно, какую переменную вы должны проверять на равенство с EOF?

4. Ааа, понял, извини, я догадался, спасибо! Я должен делать, если (s==EOF).

Ответ №1:

Сравните результат, возвращаемый scanf параметром EOF, а не параметром out, который получает введенное входное значение.

То есть замените это:

     int s = scanf("%d", amp;x);
    if (x == EOF) {
        break;
    }
 

С этим:

     int s = scanf("%d", amp;x);
    if (s == EOF) { 
        break;
    }