3

我真的很感兴趣 - 你为什么需要把

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 函数不能自己停止读取输入,以避免这种笨拙?

4

1 回答 1

7

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

第二个程序将 CRLF 组合从键盘缓冲区中拉出readln并丢弃它,因此它的行为方式似乎是您想要的。

如果这是一个一次性程序,只需通过 来完成readln,然后继续解决您正在处理的任何更重要的问题。如果它注定要用于生产,请通过某种循环readkey(在一个字符后立即返回)构建一个输入函数。

谢谢你的怀旧。

于 2011-04-17T11:43:00.810 回答