Как читать целое число в Erlang? - PullRequest
6 голосов
/ 27 марта 2009

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

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

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

Ответы [ 5 ]

11 голосов
/ 27 марта 2009
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 голосов
/ 27 марта 2009

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

2 голосов
/ 30 апреля 2010

Попробуйте напечатать число с ~w вместо ~p:

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

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

2 голосов
/ 30 апреля 2010

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

0 голосов
/ 27 марта 2009

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

...