Pascal - 读/读功能杂质?

时间:2011-04-17 11:18:04

标签: pascal freepascal

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

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 个答案:

答案 0 :(得分:7)

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

第二个程序是将CRLF组合从后面的readln拉出键盘缓冲区并丢弃它,因此它的行为方式与你想要的一样。

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

感谢怀旧。