2009-03-27 9 views
5

Estoy tratando de leer la entrada del usuario de un entero. (como cin >> nInput; en C++)
Encontré io: fread bif desde http://www.erlang.org/doc/man/io.html, así que escribo código como este.
¿Cómo leer un entero en Erlang?

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

pero cuando la entrada 10, el terminal Erlang sigo dándome "\ n" no 10. Asumo fread lee automáticamente 10 y conert esto en cadena. ¿Cómo puedo leer el valor entero directamente? ¿Hay alguna manera de hacer esto? Gracias por leer esto.

Respuesta

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

Eso es todo.

0

Erlang representa cadenas como listas de enteros que están dentro de un cierto rango. Por lo tanto, la entrada será un número que representa el carácter "1", puede restar un desplazamiento para obtener el real. Número, lo siento, no tengo una VM aquí para probar una solución.

4

Hay varias funciones en OTP para ayudarlo a convertir una cadena en un número entero. Si usted acaba de leer una cadena del usuario (hasta el salto de línea, por ejemplo) puede la evaluarlo con la función to_integer(String) en el módulo string:

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

También existe la list_to_integer(String) BIF (función incorporada, llamada simplemente sin módulo) pero no es tan indulgente como la función string:to_integer(String):

list_to_integer(String) -> int() 

Usted recibirá una excepción badarg si la cadena no contiene un número entero.

1

Si utiliza string: to_integer/1, compruebe que el valor de Rest sea la lista vacía []. La función extrae el entero, si lo hay, desde el comienzo de la cadena. No garantiza que la entrada completa se convierta en un número entero.

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

Un ejemplo:

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

por qué el cheque? Si el dedo del usuario se deslizó y golpeó 't' en lugar de 5, entonces la entrada intención era 335, no 33.

2

intente imprimir el número con ~w en lugar de ~p:

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

Los intentos de especificador ~p formato para averiguar si la lista podría ser una cadena, pero ~w nunca adivina; siempre imprime listas como listas.

Cuestiones relacionadas