2011-04-17 30 views
3

我真的很感興趣 - 你爲什麼需要把Pascal - 讀取/讀取函數雜質?

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不帶參數的終止讀取鍵盤輸入的處理。但是,如果是這樣,爲什麼讀/讀功能不能停止閱讀輸入本身,以避免這種笨拙?

回答

7

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(在一個字符後立即返回)的循環來建立一個輸入函數。

感謝您的懷舊之情。

+0

簡單明瞭,謝謝=) – Arnthor 2011-04-17 11:53:38