dmv*_*nna 2 haskell user-input ghc
我的程序就像是
main :: IO String
main = do
putStrLn "input a"
a <- getChar
putStrLn "input b"
b <- getLine
putStrLn "input c"
c <- getChar
return a:c:b
Run Code Online (Sandbox Code Playgroud)
行为:打印出"输入a",程序等待我键入Char并按回车键.从那里,它滚过getLine而不让我输入一些东西.我怎样才能让它按照我的意图去做呢?
PS:这段代码可能存在更多问题,但让我们关注我目前的问题.
该问题是由默认启用的stdin缓冲引起的 .
在文件的顶级导入IO
import System.IO
Run Code Online (Sandbox Code Playgroud)添加到您的主要(在任何getChar调用之前)
hSetBuffering stdin NoBuffering
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
当您按下X,然后Enter你X\n进入你的键盘缓冲区.
getChar读X但离开\n.然后立即getLine阅读\n并完成.
在阅读之前,您可以阅读\n另一个尾随getLine清理键盘缓冲区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)
Run Code Online (Sandbox Code Playgroud)