принудительная очистка буфера в scanf

у меня проблема со сканированием и буфером ввода в моей программе.

сначала я прошу пользователя ввести:

char someVariable;
printf("Enter text: ");
scanf(" %c",&someVariable);

а затем у меня есть цикл, который проходит через вход по одному символу за раз в scanf, пока не достигнет \n. проблема в том, что после завершения цикла каким-то образом в буфере все еще что-то есть, поэтому эта функция (которая вызывается в цикле) вызывается снова и разрушает логику в моей программе.

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

я могу использовать только scanf (требования к назначению)

void checkType(){
    char userInput;
    char tempCheckInput;
    printf("Enter Text: ");
    scanf(" %c",&userInput);
    while (userInput != '\n'){

        tempCheckInput = userInput;
        scanf("%c",&userInput);

игнорировать конец цикла, это часть, которую я получаю на входе


person DarkLeader    schedule 16.11.2019    source источник
comment
Покажите нам код, см. минимальный воспроизводимый пример.   -  person user3386109    schedule 17.11.2019
comment
@user3386109 user3386109 это длинная программа, поэтому я не хочу копировать более 100 строк, я отредактирую сообщение через секунду   -  person DarkLeader    schedule 17.11.2019


Ответы (1)


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

В C поток, такой как stdin, нельзя очистить (стандартным способом), например, "удалить все входные данные до этого момента в время".

Вместо этого ввод может потреблять и отбрасывать (аналогично «очищенному») вводу до состояния данных.

Обычно это

int consume_rest_of_line(void) {
  int ch;
  while ((ch = getchar()) != '\n' && ch != EOF) {
    ;
  }
}

Если ограничение до scanf()

int consume_rest_of_line(void) {
  char ch;
  while (scanf("%c", &ch) == 1 && ch != '\n') {
    ;
  }
}
person chux - Reinstate Monica    schedule 16.11.2019