readf неправильно присваивается в циклическом try-catch - PullRequest
0 голосов
/ 30 апреля 2018

Если в качестве входных данных для программы, приведенной ниже, введено «а», а не целое число, выходные данные переходят в цикл без остановки для дополнительного ввода. Почему?

uint inputInt = 1;
while (inputInt > 0) {
  write("enter something: ");
  try {
    readf(" %s", inputInt);
    writefln("inputInt is: %s", inputInt);
  }
  catch (Exception ex) {
    writeln("does not compute, try again.");
    inputInt = 1;
  }
}

Я бы ожидал, что inputInt получит присвоенный '1' в блоке catch, а затем снова будет выполнен блок try. Тем не менее, вывод показывает, что программа не останавливается, чтобы собрать inputInt снова во второй раз:

enter something: does not compute, try again.
enter something: does not compute, try again.
enter something: does not compute, try again.
enter something: does not compute, try again.
enter something: does not compute, try again.
etc...

1 Ответ

0 голосов
/ 01 мая 2018

Потому что, когда readf не удается, он не удаляет входные данные из буфера. Так что в следующий раз, когда цикл повторяется, он снова терпит неудачу.

Попробуйте это:

import std.stdio;
void main()
{
    uint inputInt = 1;
    while (inputInt > 0) {
        write("enter something: ");
        try {
            readf(" %s", inputInt);
            writefln("inputInt is: %s", inputInt);
        }
        catch (Exception ex) {
            readln(); // Discard current input buffer
            writeln("does not compute, try again.");
            inputInt = 1;
        }
    }
}
...