如何用erlang api解析标准输入?

时间:2013-09-30 15:01:12

标签: erlang

我正在开发Erlang游戏,现在我需要阅读标准输入。我尝试了以下电话:

io:fread() 
io:read()

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

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

3 个答案:

答案 0 :(得分:7)

读取行

您可以使用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,[]}

答案 1 :(得分:1)

关于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"]}

答案 2 :(得分:0)

控制台并不是一个很好的地方,因为你需要提前知道答案的格式。考虑到您允许空格,您需要知道在得到答案之前将输入多少单词。知道这一点,你可以使用一个字符串作为条目,然后再解析它:

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>

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