我真的很感兴趣-为什么您需要放

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会终止读取键盘输入的过程。但是如果是这样,为什么read / readln函数不能自己停止读取输入,以避免这种笨拙?

最佳答案

read读取一个字符,但是即使返回的只是1个字符,仍希望在返回之前按下Enter键。您在1之后按Enter,控制台将用CR(ASCII 0xd)和LF(ASCII 0xa)填充键盘缓冲区。 (在Linux / UNIX系统上,Make your choise仅会出现两次,因为UNIX仅使用LF作为其换行字符)。您可以通过打印用ord(CH)(iirc)接收的字符的值来查看这些内容。

第二个程序是将CRLF组合与随后的readln一起从键盘缓冲区中拉出并丢弃,因此它的行为就像您想要的那样。

如果这是一个一次性程序,只需通过readln进行操作,然后继续解决您正在处理的更重要的问题。如果要用于生产,请通过围绕readkey的某种循环构建输入函数(该循环在一个字符后立即返回)。

感谢您的怀旧。

07-26 07:04