2009-03-27 7 views
5

Ich versuche, Benutzereingabe von Integer zu lesen. (wie cin >> nInput; in C++)
Ich fand io: fread bif von http://www.erlang.org/doc/man/io.html, so schreibe ich Code wie folgt.
Wie Integer in Erlang zu lesen?

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

aber wenn ich Eingang 10, der erlang Terminal me "\ n" halten gibt nicht 10. Ich gehe davon aus fread automatisch gelesen 10 und Conert dieses in String. Wie kann ich den Integer-Wert direkt lesen? Gibt es eine Möglichkeit, dies zu tun? Danke für das Lesen.

Antwort

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

Das ist alles.

0

Erlang stellt Zeichenfolgen als Listen von Ganzzahlen dar, die innerhalb eines bestimmten Bereichs liegen. Daher ist die Eingabe eine Zahl, die das Zeichen "1" darstellt. Sie können einen Offset subtrahieren, um den tatsächlichen Wert zu erhalten. Nummer, sorry, habe keine VM hier, um eine Lösung zu testen.

4

In OTP gibt es verschiedene Funktionen, mit denen Sie eine Zeichenfolge in eine ganze Zahl konvertieren können. Wenn Sie nur eine Zeichenfolge vom Benutzer gelesen (bis Newline zum Beispiel) können Sie die mit der Funktion to_integer(String) im string Modul bewerten:

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

Es gibt auch die list_to_integer(String) BIF (Built-In-Funktion, nur Anruf ohne Modul), aber es ist nicht so nachsichtig wie die string:to_integer(String) Funktion:

list_to_integer(String) -> int() 

Sie erhalten eine badarg Ausnahme erhalten, wenn die Zeichenfolge nicht eine ganze Zahl enthalten.

1

Wenn Sie string: to_integer/1 verwenden, überprüfen Sie, ob der Wert von Rest die leere Liste [] ist. Die Funktion extrahiert die Ganzzahl, falls vorhanden, vom Anfang der Zeichenfolge. Es stellt nicht sicher, dass die vollständige Eingabe in eine Ganzzahl konvertiert wird.

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

Ein Beispiel:

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

Warum prüfen? Wenn der Finger des Benutzers gerutscht und Hit ‚t‘ statt 5, dann war die beabsichtigte Eingabe 335, nicht 33

2

die Anzahl Druck Versuchen mit ~w statt ~p:

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

Die ~p Formatspezifizierer versucht um herauszufinden, ob die Liste eine Zeichenkette sein könnte, aber ~w niemals rät; Es druckt immer Listen als Listen.