如何在 Erlang 中读取整数?
Posted
技术标签:
【中文标题】如何在 Erlang 中读取整数?【英文标题】:How to read integer in Erlang? 【发布时间】:2010-10-15 20:28:03 【问题描述】:我正在尝试读取用户输入的整数。 (如 cin >> nInput;在 C++ 中) 我从http://www.erlang.org/doc/man/io.html找到了io:fread bif,所以我写了这样的代码。
ok, X = io:fread("输入:", "~d"), io:format("~p~n", [X]).
但是当我输入 10 时,erlang 终端一直给我“\n”而不是 10。我假设 fread 自动读取 10 并将其转换为字符串。如何直接读取整数值?有没有办法做到这一点?感谢您阅读本文。
【问题讨论】:
【参考方案1】:Erlang 将字符串表示为特定范围内的整数列表。因此,输入将是一个代表字符“1”的数字,您可以减去偏移量以获得实际值。号码,抱歉这里没有虚拟机来测试解决方案。
【讨论】:
【参考方案2】:OTP 中有多种函数可帮助您将字符串转换为整数。如果您只是从用户那里读取一个字符串(例如直到换行),您可以使用 string
模块中的函数 to_integer(String)
对其进行评估:
string:to_integer(String) -> Int,Rest | error,Reason
还有list_to_integer(String)
BIF(内置函数,只调用不带模块)但不如string:to_integer(String)
函数宽容:
list_to_integer(String) -> int()
如果字符串不包含整数,您将收到badarg
异常。
【讨论】:
【参考方案3】:1> ok, [X] = io:fread("input : ", "~d").
input : 10
ok,"\n"
2> X.
10
3> ok, [A,B] = io:fread("input : ", "~d,~d").
input : 456,26
ok,[456,26]
就是这样。
【讨论】:
【参考方案4】:如果使用string:to_integer/1,检查Rest的值是否为空列表[]。该函数从字符串的开头提取整数(如果有)。它不能保证完整的输入转换为整数。
string:to_integer(String) -> Int,Rest | error,Reason
一个例子:
Int, Rest = string:to_integer("33t").
Int. % -> 33
Rest. % -> "t"
为什么要检查?如果用户的手指滑动并按下 't' 而不是 5,则预期输入是 335,而不是 33。
【讨论】:
【参考方案5】:尝试使用~w
而不是~p
打印号码:
1> io:format("~w~n", [[10]]).
[10]
ok
2> io:format("~p~n", [[10]]).
"\n"
ok
~p
格式说明符试图确定列表是否可能是一个字符串,但~w
从不猜测;它总是将列表打印为列表。
【讨论】:
以上是关于如何在 Erlang 中读取整数?的主要内容,如果未能解决你的问题,请参考以下文章
Erlang:控制Erlang进程崩溃时如何使连接的外部OS进程自动死亡?