2016-02-12 107 views
2

我的程序去像函數getline不會停止

main :: IO String 
main = do 
    putStrLn "input a" 
    a <- getChar 
    putStrLn "input b" 
    b <- getLine 
    putStrLn "input c" 
    c <- getChar 
    return a:c:b 

行爲:我得到「輸入」印刷和程序等待我輸入一個字符,然後按返回。從那裏,它滾動通過getLine沒有讓我輸入的東西。我怎樣才能讓它做到我想要的呢?

P.S .:這個代碼可能有更多的問題,但讓我們把重點放在我現在的問題上。

+1

這是您的實際代碼之前尾隨\n與另一getLine清潔鍵盤緩衝區?你有沒有試過運行它?你的代碼片段不適合我,因爲你缺少'a:c:b'的括號。當我添加括號時,其行爲如預期。 –

+0

我想你可能應該禁用緩衝(使用[hSetBuffering](https://hackage.haskell.org/package/base-4.8.2.0/docs/System-IO)。html#v:hSetBuffering)) - 這應該解決這些問題 – Carsten

回答

6

當您按下X然後輸入X\n進入你的鍵盤緩衝區。

getChar讀數爲X但是留下了\n。然後getLine剛剛讀取\n並立即結束。

您可以閱讀閱讀b

main :: IO String 
main = do 
    putStrLn "input a" 
    a <- getChar 
    getLine --clean kbd buffer 
    putStrLn "input b" 
    b <- getLine 
    putStrLn "input c" 
    c <- getChar 
    return (a:c:b) 
+0

雖然使用stdin NoBuffering是正確的事情,但這個答案更好地解釋了這個問題。實際的代碼有多個'do'語句。爲了理解哪些人使用'stdin NoBuffering',我需要首先理解發生了什麼。沒有理由爲什麼我應該改變'stdout'的默認值。 – dmvianna

3

我想我知道你在說什麼(即使你的代碼不編譯),這應該修復它(至少它usual.y對我來說):BTW

​​

:我認爲我有這些問題在ESHELL和內部GHCI窗戶,但我不是100%肯定 - 從來沒有在bash雖然


當然

它可能是getChargetLine奇怪的組合太;)

反正這樣的:

import System.IO 

main :: IO() 
main = do 

    hSetBuffering stdin NoBuffering 
    hSetBuffering stdout NoBuffering 

    putStrLn "input a" 
    a <- getLine 
    putStrLn "input b" 
    b <- getLine 
    putStrLn "input c" 
    c <- getLine 
    print (a,b,c) 

應打印的提示,讓您輸入3個輸入,最後打印元組

6

的問題是由默認啓用標準輸入緩衝引起的。

  1. 導入IO在你的文件的頂層

    import System.IO 
    
  2. 添加到您的(之前的任何的getchar調用)

    hSetBuffering stdin NoBuffering 
    
import System.IO 
main = do 
    hSetBuffering stdin NoBuffering 
    putStrLn "input a" 
    a <- getChar 
    putStrLn "input b" 
    b <- getLine 
    putStrLn "input c" 
    c <- getChar 
    print $ a:(c:b)