如何在 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进程自动死亡?

如何等待用户的输入并继续进行erlang并发编程中的进一步代码?

Elixir/Erlang 并发状态访问

如何从erlang中的字符串中删除符号

如何在 Rust 1.0 中读取用户输入的整数?

如何使用 cin 将整数从控制台读取到向量中