Я пытаюсь подтвердить ввод пользователя.Но если я ввел недопустимый символ, программа переходит в бесконечный цикл - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь подтвердить ввод пользователя. В случае неправильного ввода я пытаюсь попросить пользователя заново ввести правильное числовое (двойное) значение.

Программа не работает, идет бесконечный цикл.

Не могли бы вы дать мне предложение, как я могу это сделать? Спасибо.!!

</p>

<p>int main() {</p>

<pre><code>double t; /* Input from user */

int  check;
check = 0;

/* This loop is use to validate the user input.                 *
 * For example: If the user insert a character value "x".       *
 * i am trying to ask the user to insert a valid numeric value. */

while (check == 0)
{
    printf("Insert the value: ");
    if (scanf(" %lf", &t) == 1) {
        check = 1;          /* Everythink okay. No loop needed */
    }
    else
    {
        printf("Failed to read double. ");
        check = 0;          /* loop aganin to read the value */
        fflush( stdout );
    }
}

return 0;

}

ожидаемые результаты: $ ./a.out
Введите значение: X
Не удалось прочитать дважды.
Введите значение: 5


фактические результаты:
$ ./a.out
Введите значение: X
Введите значение: не удалось прочитать дважды. Введите значение: не удалось прочитать дважды. (петля) ...

1 Ответ

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

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

Код OP просто повторно пытается бесконечно преобразовывать одни и те же ошибочные данные.

Когда scanf(" %lf", &t) == 0, нечисловой ввод остается в stdin и должен быть удален. @ Евгений Ш. .

int conversion_count = 0;
while (conversion_count == 0) {
  printf("Insert the value: ");
  // Note: lead space not needed. "%lf" itself consumes leading space.
  // if (scanf(" %lf", &t) == 1) {  
  conversion_count = scanf("%lf", &t); 

  // conversion_count is 1, 0 or EOF
  if (conversion_count == 0) {
    printf("Failed to read double.\n");
    fflush(stdout);

    int ch;
    // consume and discard characters until the end of the line.
    while ( ((ch = getchar()) != '\n') && (ch != EOF)) {
      ; 
    }
    if (ch == EOF) {
      break;
    }
  }
}

if (conversion_count == 1) {
  printf("Read %g\n", t);
}  else {
  printf("End-of-file or input error\n");
}
...