Как читать 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", Вы можете вычесть смещение, чтобы получить фактическое значение. Номер, извините, здесь нет виртуальной машины для тестирования решения.