2016-03-15 2 views
0

ИТАК после прочтения этих предыдущих вопросов:Бесконечный цикл при попытке очистить входной буфер

Alternate method for clearing input buffer in c

How to clear input buffer in C?

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

#include <stdio.h> 
#include <stdlib.h> 


int Empty(); 
int main() 
{ 
    double x; 
    int y=0; 
    while(y==0) 
    { 
     y=1; 

     if(scanf("%lf",&x)!=1 || Empty()>1) //checks if the value is acceppted 
              // and then attempts to empty 
              // the input buffer. I always expect 
              //at least 1 returned due to the 
              // EOF or '\n' 
     { 
      fprintf(stdout,"Invalid character(s) entered, please re-enter.\n"); 
      y=0; 
     } 
    } 
    return(x); 
} 

int Empty() 
{ 
    int clearr,n=0; 
    do 
    { 
     n++; 
    }while((clearr=fgetc(stdin))!= EOF && clearr !='\n'); // If EOF or '\n' is reached 
                  // it ends, returning the 
                 //number of characters 
    return(n); 
} 

Если я запустил программу и введите 2 или 2.2 и т.д., номер принимается и возвращается.

Если я вхожу 2, или 2 а или 2 2 и т.д. он всегда ловит пространство/письмо/и т.д., и заставляет одну петлю, чтобы позволить вам попробовать и повторно значение

Если, однако, если ввести обижая элемент, то есть a, сначала происходит бесконечный цикл.

Это не имеет для меня никакого смысла, поскольку, как я понимаю, когда fgetc(stdin) называется, он ДОЛЖЕН вытягивать либо символ, либо EOF, который означал бы, что был введен только один элемент, заканчивающийся циклом.

+0

Откуда вы знаете, что это петли? – EOF

+0

Он печатает f «Введен неверный символ (ы), пожалуйста, заново введите. \ N" бесконечно – Hobojoe

ответ

1

В тесте if(A || B), если A истинно, B не оценено.

Так что если scanf("%lf",&x)!=1 истинно, Empty() не вызывается, и ваша петля продолжается навсегда.

Одна из проблем здесь является то, что вы пытаетесь сделать несколько вещей сразу, совет будет:

  • держать вещи простыми
  • побочных эффектов

Так 1) сканирование вход, 2) если он нормально перемещается, 3) если он не заподлицо и не повторяется.

+0

Хорошо спасибо, что сработало, однако, если я теперь положил 2a, он принимает 2, а затем движется дальше, игнорируя a, который я однажды снова не может понять, почему это произойдет. – Hobojoe

+0

Я понял, что это один, он входит, потому что оба значения не верны, это 1 и 0, поэтому он не подводит итог – Hobojoe

1

Если вы введете a, scanf("%lf",&x) даст 0 и, следовательно, он никогда не называет Empty.

Смежные вопросы