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文字を読み取りますが、1文字しか返さない場合でも、戻る前にEnterキーが押されることを期待します。1の後にEnterキーを押すと、コンソールはキーボードバッファにCR(ASCII 0xd)と(ASCII 0xa)を詰め込んでいLFます。(Linux / UNIXシステムでは、UNIXは改行文字としてMake your choiseのみを使用するため、表示されるのは2回だけです)。これらは、 (iirc)LFで受け取った文字の値を印刷することで確認できます。ord(CH)

2番目のプログラムは、CRLFコンボをキーボードバッファーから引き出し、後続のプログラムでreadln破棄するため、希望どおりに動作します。

これが使い捨てプログラムの場合は、を介して実行しreadln、作業中のより重要な問題を解決してください。本番用の場合は、ある種のループreadkey(1文字の直後に戻る)を介して入力関数を作成します。

懐かしさをありがとう。

于 2011-04-17T11:43:00.810 に答える