7

我正在尝试读取整数的用户输入。(如 cin >> nInput; 在 C++ 中)我从http://www.erlang.org/doc/man/io.html
找到了 io:fread bif ,所以我编写了这样的代码。

{ok, X} = io:fread("input : ", "~d"),
io:format("~p~n", [X])。

但是当我输入 10 时,erlang 终端一直给我“\n”而不是 10。我假设 fread 自动读取 10 并将其转换为字符串。如何直接读取整数值?有没有办法做到这一点?谢谢您阅读此篇。

4

5 回答 5

11
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]}

就这样。

于 2009-03-27T09:04:45.523 回答
4

OTP 中有多种函数可帮助您将字符串转换为整数。如果您只是从用户那里读取一个字符串(例如直到换行),您可以使用模块to_integer(String)中的函数对其进行评估string

string:to_integer(String) -> {Int,Rest} | {error,Reason}

还有list_to_integer(String)BIF(内置函数,只需在没有模块的情况下调用),但它不像string:to_integer(String)函数那样宽容:

list_to_integer(String) -> int()

badarg如果字符串不包含整数,则会出现异常。

于 2009-03-27T08:17:26.917 回答
2

如果使用 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。

于 2010-04-29T23:59:04.537 回答
2

尝试使用~w而不是打印数字~p

1> io:format("~w~n", [[10]]).
[10]
ok
2> io:format("~p~n", [[10]]).
"\n"
ok

格式说明~p符试图确定列表是否可能是一个字符串,但从~w不猜测;它总是将列表打印为列表。

于 2010-04-30T12:02:32.880 回答
0

Erlang 将字符串表示为特定范围内的整数列表。因此,输入将是一个代表字符“1”的数字,您可以减去偏移量以获得实际值。号码,抱歉这里没有虚拟机来测试解决方案。

于 2009-03-27T02:46:12.533 回答