我的程序就像
main :: IO String
main = do
putStrLn "input a"
a <- getChar
putStrLn "input b"
b <- getLine
putStrLn "input c"
c <- getChar
return a:c:b
行为:我得到&#34;输入&#34;打印出来,程序等我输入Char并按回车键。从那里,它滚动过 getLine ,而不会让我输入任何东西。我怎样才能让它按照我的意图去做呢?
P.S。:此代码可能存在更多问题,但请关注我目前的问题。
答案 0 :(得分:6)
问题是由默认启用的 stdin缓冲引起的。
在文件顶层导入IO
import System.IO
添加到主(在任何 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)
答案 1 :(得分:6)
当您按 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)
答案 2 :(得分:3)
我想我知道你在说什么(即使你的代码没有编译),这应该解决它(至少它通常对我来说):
import System.IO
hSetBuffering stdin NoBuffering
hSetBuffering stdout NoBuffering
顺便说一句:我认为我在 eshell 和GHCi内部的窗口中存在这些问题,但我并不是百分百肯定 - 但从来没有在bash中使用
当然它也可能是getChar
和getLine
的奇怪组合;)
无论如何:
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个输入,最后打印元组