как использовать EOF как простое чтение в cc - PullRequest
0 голосов
/ 11 декабря 2018

почему цикл while начинает выполняться бесконечно, если я ввожу любой алфавит, а когда я ввожу любое число, он выполняется только один раз.Функция Scanf ("% d", & a) возвращает 1 для любого числа и 0 для любого символа или строки.Как я знаю EOF не равно 1 и 0.

#include<stdio.h>
int main
{
    int a;
    while(scanf("%d",&a) != EOF)
    {
        printf("hi devender \n");
    }
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

почему цикл while начинает выполняться бесконечно, если я ввожу любой алфавит

scanf("%d",&a) функция возвращает 1 для любого числа и 0 для любого символа или строки.Как я знаю, EOF не равно 1 и 0

Похоже, что ключевые проблемы для OP заключаются в том, что при сбое сопоставления текст в stdin не используется.Так что, как только "abc\n" введен.'a' и остальные остаются в stdin до тех пор, пока какая-либо другая функция ввода не прочитает их.Поскольку у кода нет других способов чтения данных, у нас есть бесконечный цикл.


Обычный обходной путь для чтения оскорбительного символа

#include<stdio.h>
int main() {
  int scan_count;
  int a;
  while((scan_count = scanf("%d",&a)) != EOF) {
    if (scan_count == 0) {
      getchar();
    }
    printf("hi devender \n");
  }
  return 0;
}

Или, как другие предполагают, потребляютдо конца строки ввода.

0 голосов
/ 11 декабря 2018
// input buffer==> 42foo\n
scanf("%d", &a); // returns 1 (not EOF), a is now 42
// input buffer==> foo\n
scanf("%d", &a); // returns 0 (not EOF), see comments about a
// input buffer==> foo\n  // no change
scanf("%d", &a); // returns 0 (not EOF)
// input buffer==> foo\n  // no change
scanf("%d", &a); // returns 0 (not EOF)
// input buffer==> foo\n  // no change
... ... infinite loop

Короче говоря, не сравнивайте возвращаемое значение из scanf() с EOF;сравнить с количеством ожидаемых назначений.

if (scanf("%d%s%d%d", &a, name, &b, &c) != 4) /* error */;
0 голосов
/ 11 декабря 2018

Я не знаю, что вы пытаетесь сделать, но чтобы понять, что проблема с бесконечным циклом в том, что буфер не пустой, попробуйте этот код.

include

int main(void)
{
    int a,c;
    while(scanf("%d",&a) !=EOF)
        {
            printf("hi devender \n");
            while ( ( c = getchar() ) != EOF && c != '\n' ) ; //empty the buffer
        }
    printf("Finished");
    return 0;
}
0 голосов
/ 11 декабря 2018

Per справочная страница scanf() (шахтный шрифт):

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха эти функции возвращаютколичество элементов ввода, успешно сопоставленных и назначенных; это может быть меньше, чем предусмотрено, или даже ноль, в случае раннего сбоя сопоставления .

Если вы не введете число, вы получите сбой сопоставленияи scanf() возвращает ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...