7

整数のユーザー入力を読み取ろうとしています。(C++ では cin >> nInput; のように) http://www.erlang.org/doc/man/io.html
から io:fread bif を見つけたので、このようにコードを記述します。

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

しかし、10 を入力すると、erlang 端末は 10 ではなく "\n" を返し続けます。fread は自動的に 10 を読み取り、これを文字列に変換すると仮定します。整数値を直接読み取るにはどうすればよいですか? これを行う方法はありますか?これを読んでくれてありがとう。

4

5 に答える 5

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

それで全部です。

于 2009-03-27T09:04:45.523 に答える
4

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文字列に整数が含まれていない場合は、例外が発生します。

于 2009-03-27T08:17:26.917 に答える
2

~wの代わりに番号を印刷してみてください~p

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

フォーマット指定子は~p、リストが文字列である可能性があるかどうかを判断しようとしますが、~w推測することはありません。常にリストをリストとして出力します。

于 2010-04-30T12:02:32.880 に答える
2

string:to_integer/1 を使用する場合は、Rest の値が空のリスト [] であることを確認してください。この関数は、文字列の先頭から整数があればそれを抽出します。完全な入力が整数に変換されることは保証されません。

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

例:

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

なぜチェックするのですか?ユーザーの指が滑って 5 ではなく 't' を押した場合、意図した入力は 33 ではなく 335 でした。

于 2010-04-29T23:59:04.537 に答える
0

Erlang は、特定の範囲内にある整数のリストとして文字列を表します。したがって、入力は文字「1」を表す数値になり、オフセットを差し引いて実際の数値を取得できます。番号、申し訳ありませんが、ソリューションをテストするための VM がここにありません。

于 2009-03-27T02:46:12.533 に答える