2009-03-27 47 views
5

Tôi đang cố đọc đầu vào của người dùng là số nguyên. (như cin >> nInput; in C++)
Tôi tìm thấy io: fread bif từ http://www.erlang.org/doc/man/io.html, vì vậy tôi viết mã như thế này.
Làm thế nào để đọc số nguyên trong Erlang?

{ok, X} = io: fread ("đầu vào:", "~ d"),
io: định dạng ("~ p ~ n", [X]).

nhưng khi tôi nhập 10, thiết bị đầu cuối erlang tiếp tục cho tôi "\ n" chứ không phải 10. Tôi giả định tự động đọc 10 và đưa chuỗi này vào chuỗi. Làm thế nào tôi có thể đọc giá trị số nguyên trực tiếp? Có cách nào để làm điều này không? Cảm ơn vì đã đọc nó.

Trả lời

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

Đó là tất cả.

0

Erlang đại diện cho chuỗi như danh sách các số nguyên nằm trong một phạm vi nhất định. Vì vậy, đầu vào sẽ là một số đại diện cho ký tự "1", bạn có thể trừ một khoản bù trừ để có được thực tế. Số, xin lỗi không có một VM ở đây để kiểm tra một giải pháp.

4

Có nhiều chức năng khác nhau trong OTP để giúp bạn chuyển đổi chuỗi thành số nguyên. Nếu bạn chỉ đọc một chuỗi từ người sử dụng (cho đến khi xuống dòng ví dụ), bạn có thể đánh giá nó với chức năng to_integer(String) trong string mô-đun:

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

Ngoài ra còn có các list_to_integer(String) BIF (Built-In Chức năng, chỉ cần gọi mà không có một mô-đun) nhưng nó không phải là tha thứ như string:to_integer(String) chức năng:

list_to_integer(String) -> int() 

Bạn sẽ nhận được một ngoại lệ badarg nếu chuỗi không chứa một số nguyên.

1

Nếu bạn sử dụng chuỗi: to_integer/1, hãy kiểm tra xem giá trị của Rest là danh sách rỗng []. Hàm này trích xuất số nguyên, nếu có, từ đầu chuỗi. Nó không đảm bảo rằng đầu vào đầy đủ chuyển đổi thành một số nguyên.

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

Một ví dụ:

{Int, Rest} = string:to_integer("33t"). 
Int. % -> 33 
Rest. % -> "t" 

Tại sao kiểm tra? Nếu ngón tay của người dùng bị trượt chân và nhấn 't' thay vì 5, sau đó các đầu vào có ý định là 335, không phải 33.

2

Thử in số với ~w thay vì ~p:

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

Định dạng ~p cố gắng specifier để tìm hiểu xem danh sách có thể là một chuỗi hay không, nhưng ~w không bao giờ đoán được; nó luôn luôn in danh sách dưới dạng danh sách.

Các vấn đề liên quan