我真的很感兴趣 - 为什么你需要放
readln;
Run Code Online (Sandbox Code Playgroud)
从键盘读取一些值到变量后的行?例如,
repeat
writeln('Make your choise');
read(CH);
if (CH = '1') then begin
writeln('1');
end;
{ ... }
until CH = 'q';
Run Code Online (Sandbox Code Playgroud)
如果您运行以下代码,并在键盘上按"1",您会得到类似的输出
1
Make your choise
Make your choise
Make your choise
Run Code Online (Sandbox Code Playgroud)
另一方面,如果你添加"readln;" 这一切都很完美:
repeat
writeln('Make your choise');
read(CH);
readln;
if (CH = '1') then begin
Writeln('1');
end
until CH = 'q';
Run Code Online (Sandbox Code Playgroud)
我唯一的猜测是,不带参数调用readln会终止读取键盘输入的过程.但如果是这样,为什么读取/读取功能无法自行停止读取输入,以避免这种笨拙?
read读取一个字符,但仍然要求在返回之前按Enter键,即使它只返回1个字符.你在1之后按Enter键,控制台正在用CR(ASCII 0xd)和LF(ASCII 0xa)填充键盘缓冲区.(在Linux/UNIX系统上,Make your choise只会出现两次,因为UNIX仅使用a LF作为其换行符).您可以通过打印ord(CH)(iirc)收到的字符值来查看这些内容.
第二个程序是将CRLF组合从键盘缓冲区中拉出,然后readln将其丢弃,这样它的行为就像你想要的那样.
如果这是一次性计划,只需通过readln,然后继续解决您正在处理的任何更重要的问题.如果它用于生产,则通过某种循环readkey(在一个字符后立即返回)构建一个输入函数.
感谢怀旧.