Паскаль - читать / читать функцию примесей? - PullRequest
3 голосов
/ 17 апреля 2011

Мне действительно интересно - зачем тебе ставить

readln;

строка после чтения некоторого значения с клавиатуры в переменную? Например,

repeat
writeln('Make your choise');
read(CH);

if (CH = '1') then begin
writeln('1');
end;

{ ... }
until CH = 'q';

Если вы запустите следующий код и нажмете «1» на клавиатуре, вы получите вывод типа

1
Make your choise
Make your choise
Make your choise

С другой стороны, если вы добавите это "readln;" линия, все отлично работает:

repeat
writeln('Make your choise');
read(CH);
readln;

if (CH = '1') then begin
    Writeln('1');
end

until CH = 'q';

Мое единственное предположение состоит в том, что вызов readln без аргументов завершает процесс чтения ввода с клавиатуры. Но если это так, почему функции чтения / чтения не могут сами прекратить чтение ввода, чтобы избежать такой неуклюжести?

1 Ответ

7 голосов
/ 17 апреля 2011

read читает символ, но все еще ожидает нажатия клавиши Enter перед возвратом, даже если он возвращает только 1 символ. Вы нажимаете Enter после 1, и консоль заполняет буфер клавиатуры значениями CR (ASCII 0xd) и LF (ASCII 0xa). (В системе Linux / UNIX Make your choise будет отображаться только дважды, потому что UNIX использует только LF в качестве символа перевода строки). Вы можете увидеть это, напечатав значения символа, полученные с помощью ord(CH) (iirc).

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

Если это одноразовая программа, просто сделайте это через readln и продолжайте решать любую более важную проблему, над которой вы работаете. Если он предназначен для производства, создайте функцию ввода через цикл вроде readkey (который возвращается сразу после одного символа).

Спасибо за ностальгию.

...