Как читать integer в Erlang?

Я пытаюсь прочитать пользовательский ввод integer. (например, cin > > nInput; в C++)
Я нашел io: fread bif от http://www.erlang.org/doc/man/io.html, поэтому я пишу такой код.

{ok, X} = io: fread ("вход : ", "~d"),
io: формат ("~p~n", [X]).

но когда я ввожу 10, терминал erlang продолжает давать мне "n " не 10. Я предполагаю, что fread автоматически прочитал 10 и conert это в строку. Как я могу читать целочисленное значение напрямую? Есть ли способ сделать это? Спасибо, что прочитали это.

5 ответов


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

вот и все.


в 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 исключение, если строка не содержит целое число.


Если вы используете 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.


попробуйте распечатать номер с помощью ~w вместо ~p:

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

на ~p спецификатор формата пытается выяснить, может ли список быть строкой, но ~w никогда не догадывается; он всегда печатает списки как списки.


Erlang представляет строки как списки целых чисел, которые находятся в определенном диапазоне. Поэтому ввод будет числом, представляющим символ "1", Вы можете вычесть смещение, чтобы получить фактическое значение. Номер, извините, здесь нет виртуальной машины для тестирования решения.