【问题标题】:Pascal - read/readln function impurities?帕斯卡 - 读取/读取函数杂质?
【发布时间】:2011-04-17 11:18:03
【问题描述】:

我真的很感兴趣——你为什么需要放

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

【问题讨论】:

    标签: pascal freepascal


    【解决方案1】:

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

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

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

    感谢你的怀旧。

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多