'getLine'无法正常工作,被跳过

时间:2019-04-14 13:14:36

标签: haskell

我对Haskell还是很陌生,正在编写一些简单的文本/文件操作功能。我目前正在尝试将字符串添加到文件中之前对其进行修改。

我有一个函数'insertChar',它在字符串的任何给定位置添加一个字符(使用Haskell https://wiki.haskell.org/99_questions/21_to_28中99个问题中的问题21的解决方案)。

info.plist

要求用户输入字符串,然后输入希望添加到该字符串的字符,最后输入希望添加该字符的字符串位置。我可以很好地输入字符串,但是在输入字符后按Enter键时,用于输入位置的'getLine'被跳过,并产生以下错误;

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

我已经看到了这个堆栈溢出的帖子; haskell -skipping getLine

,并尝试按照该答案将代码更改为;

public class first_test {
    WebDriver driver = new ChromeDriver();

    @BeforeTest
    public void tearup()
    {
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.get("https://accounts.google.com");

    }

  @Test
  public void mail() throws InterruptedException  {
      WebElement email=driver.findElement(By.id("identifierId"));
      email.click();
      email.sendKeys("sharfulumair");
      WebElement password=driver.findElement(By.id("//*[@name=\"password\"]"));
      password.click();
      password.sendKeys("abcd");
  }


  @AfterTest  
  public void teardown()
  {
    driver.close();
  }


}

但是,它仍然会产生相同的错误。知道我在做什么错吗?

2 个答案:

答案 0 :(得分:2)

感谢威廉·范·昂塞姆(Willem Van Onsem)对我的原始问题的评论,我已经找到了解决方案。我在“ putStrLn“插入位置””行之后添加了“ getLine”,因此代码现在看起来像这样;

import System.Environment   
import System.Directory  
import System.IO 
import Data.List  

main :: IO ()
main = do 
      putStrLn "Insert a string"
      word <- getLine
      putStrLn "Insert a char"
      char <- getChar
      putStrLn "Insert a position"
      temp <- getLine *line that has been added*
      pos <- getLine
      let x = (read pos :: Int)
      putStrLn "Adding char to list..."
      let newS = [(insertChar char word x)]
      putStrLn "Printed list: "
      print (newS)
      putStrLn "Insert file name"
      file <- getLine
      putStrLn "Adding new string to file..."
      add file newS

insertChar :: a -> [a] -> Int -> [a]
insertChar x ys     1 = x:ys
insertChar x (y:ys) n = y:insertChar x ys (n-1)

add :: String -> [String] -> IO ()  
add fileName [item] = appendFile fileName item

答案 1 :(得分:0)

您导入了正确的内容,但从未真正调用它!试试这个:

main = do
    hSetBuffering stdin NoBuffering
    -- ...all the rest of your original main, exactly as it used to be

这样,当它到达getChar行时,只要您按下一个键,它就会从getChar返回-不必等到按Enter键。 UI会更有意义,代码也将有意义,因为您不需要吞下用户实际上并不想输入的幻像换行符。