Как удалить мусорные символы из ввода в C - PullRequest
0 голосов
/ 28 января 2019

У меня есть кусок кода, который работает для проверки ввода, мне нужно немного больше объяснения, почему он работает.Строка, где переменная мусора читает символ из getchar и проверяет, не равен ли он EOF, немного смущает меня.Его цель - прочитать ввод мусора от пользователя и позволить пользователю повторно ввести ввод.У меня вопрос, как именно эта линия работает?

  int steps = 0;                                                
  int true;                                                 
  int garbage;                                              

printf("Enter the integer increment number in the range ");  
printf("of[%d - %d]: ", minInput, maxInput);
true = scanf("%d", &steps);

/* INPUT VALIDATION */

while (!true || isdigit(steps) ||(steps < minInput || steps > maxInput) ){  
    while ((garbage = getchar()) != EOF && garbage != '\n') {                   
    } // end while;

    printf("Invalid input... please enter a number in the range ");
    printf("of[%d - %d]: ", minInput, maxInput);
    true = scanf("%d", &steps);

}// end while

1 Ответ

0 голосов
/ 28 января 2019

Вызов scanf() со спецификатором формата %d извлечет только десятичные цифры и прекратит интерпретацию ввода для первого нецифрового символа.Однако он обычно не будет возвращаться вообще, пока не будет буферизована вся строка, поэтому будет как минимум новая строка в буфере и, возможно, другие нецифровые символы.

Оператор:

while ((garbage = getchar()) != EOF && garbage != '\n')

читает все буферизованные символы до конца строки или EOF.В то время как поток ввода с консоли может выдавать «конец файла», поток stdin может быть перенаправлен из файла и не должен ссылаться на ввод с консоли.EOF может быть вставлен в поток ввода консоли через зависящий от платформы код CTRL, и при перенаправлении из файла, если файл содержит строку без перевода строки, цикл не прерывается.

Использование isdigit(steps) является неправильным - steps является целочисленным значением, а isdigit() проверяет одиночное символьное значение, чтобы определить, представляет ли оно десятичную цифру.steps неявно является допустимым значением в силу того, что true является ненулевым и спецификатором формата %d, поэтому, если намерение состоит в том, чтобы определить, что было введено число, то для чего true.

...