2

Erlang でゲームを開発していますが、標準入力を読み取る必要があります。私は次の呼び出しを試みました:

io:fread() 
io:read()

問題は、空白が含まれている場合、文字列全体を読み取れないことです。だから私は次の質問があります:

  1. ユーザーがエンターキーを押したときに入力された文字列を読み取るにはどうすればよいですか? (文字列には空白が含まれていることに注意してください)
  2. 「56」のような文字列を数値 56 に変換するにはどうすればよいですか?
4

3 に答える 3

7

読み込まれた行

io:get_line/1コンソールから改行で終了する文字列を取得するために使用できます。

3> io:get_line("Prompt> ").
Prompt> hello world how are you?
"hello world how are you?\n"

io:readは erlang 用語を取得するため、ユーザーに文字列を引用符で囲んでもらいたい場合を除き、文字列を読み取ることはできません。

のパターンでio:freadは、スペースを含む任意の長さの文字列を読み取れないようです。

パース整数

"56"56使用して変換できますerlang:list_to_integer/1

5> erlang:list_to_integer("56").
56

またはstring:to_integer/1which を使用すると、残りの文字列も返されます

10> string:to_integer("56hello").
{56,"hello"}
11> string:to_integer("56").     
{56,[]}
于 2013-09-30T17:51:13.400 に答える
1

io:fread/2に関するerlang のドキュメントが役に立ちます。

フィールド長を使用して、任意の長さの文字 (空白を含む) を読み取ることができます。

io:fread("Prompt> ","~20c").
Prompt> This is a sentence!!
{ok,["This is a sentence!!"]}   

文字列 (文字のリスト) を整数に変換することに関しては、erlang:list_to_integer/1がその仕事をします:

7> erlang:list_to_integer("645").
645

編集: io:fread/2 を試してみてください。フォーマット シーケンスは、何らかの形式のパターン マッチングを適用することで、データの解析を容易にすることができます。

9> io:fread("Prompt> ","~s ~s").
Prompt> John Doe
{ok,["John","Doe"]}
于 2013-09-30T15:30:34.687 に答える
0

コンソールは、回答の形式を事前に知る必要があるため、実際には適切な場所ではありません。スペースを許可することを考慮して、答えを得る前に入力される単語数を知る必要があります。それを知っていれば、文字列をエントリとして使用し、後で解析できます。

1> io:read("Enter a text > ").
Enter a text > "hello guy, this is my answer :o)".
{ok,"hello guy, this is my answer :o)"}
2>

悪いニュースは、ユーザーが引用符と最後のドットを入力する必要があり、ユーザーフレンドリーではないことです...

于 2013-09-30T17:32:22.497 に答える