【问题标题】:How can i parse the standard input with the erlang api?如何使用 erlang api 解析标准输入?
【发布时间】:2013-09-30 15:01:12
【问题描述】:

我正在用 Erlang 开发一个游戏,现在我需要读取标准输入。我尝试了以下调用:

io:fread() 
io:read()

问题是当它包含空格时,我无法读取整个字符串。所以我有以下问题:

  1. 当用户按下回车键时,我如何读取用户输入的字符串? (记住字符串中包含空格)
  2. 如何在数字 56 中转换像“56”这样的字符串?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    读取线

    您可以使用io:get_line/1 从控制台获取由换行符终止的字符串。

    3> io:get_line("Prompt> ").
    Prompt> hello world how are you?
    "hello world how are you?\n"
    

    io:read 将为您提供 erlang 术语,因此您无法读取字符串,除非您想让您的用户将字符串括在引号中。

    io:fread 中的模式似乎不允许您读取包含空格的任意长度字符串。

    解析整数

    您可以使用erlang:list_to_integer/1"56" 转换为56

    5> erlang:list_to_integer("56").
    56
    

    或使用string:to_integer/1 也会返回字符串的其余部分

    10> string:to_integer("56hello").
    {56,"hello"}
    11> string:to_integer("56").     
    {56,[]}
    

    【讨论】:

      【解决方案2】:

      关于 io:fread/2 的 erlang documentation 应该可以帮助您。

      您可以使用字段长度来读取任意长度的字符(包括空格):

      io:fread("Prompt> ","~20c").
      Prompt> This is a sentence!!
      {ok,["This is a sentence!!"]}   
      

      至于将字符串(字符列表)转换为整数,erlang:list_to_integer/1 完成了这项工作:

      7> erlang:list_to_integer("645").
      645
      

      编辑:尝试使用 io:fread/2,格式序列可以通过应用某种形式的模式匹配来简化数据解析:

      9> io:fread("Prompt> ","~s ~s").
      Prompt> John Doe
      {ok,["John","Doe"]}
      

      【讨论】:

      • io:fread("Prompt> ","~20c) 的问题是字符串长度必须为20个字符,否则会报错。感谢Berzemus的建议。
      【解决方案3】:

      控制台并不是一个真正适合你的地方,因为你需要提前知道答案的格式。考虑到您允许空格,您需要知道在获得答案之前将输入多少个单词。知道了,就可以用一个字符串作为入口,以后再解析:

      1> io:read("Enter a text > ").
      Enter a text > "hello guy, this is my answer :o)".
      {ok,"hello guy, this is my answer :o)"}
      2>
      

      坏消息是用户必须输入引号和最后一个点,对用户不友好...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 2019-11-05
        • 2022-11-10
        相关资源
        最近更新 更多