【问题标题】:How to read integer in Erlang?如何在 Erlang 中读取整数?
【发布时间】:2010-10-15 20:28:03
【问题描述】:

我正在尝试读取用户输入的整数。 (如 cin >> nInput;在 C++ 中)
我从http://www.erlang.org/doc/man/io.html找到了io:fread bif,所以我写了这样的代码。

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

但是当我输入 10 时,erlang 终端一直给我“\n”而不是 10。我假设 fread 自动读取 10 并将其转换为字符串。如何直接读取整数值?有没有办法做到这一点?感谢您阅读本文。

【问题讨论】:

    标签: input erlang integer


    【解决方案1】:

    Erlang 将字符串表示为特定范围内的整数列表。因此,输入将是一个代表字符“1”的数字,您可以减去偏移量以获得实际值。号码,抱歉这里没有虚拟机来测试解决方案。

    【讨论】:

      【解决方案2】:

      OTP 中有多种函数可帮助您将字符串转换为整数。如果您只是从用户那里读取一个字符串(例如直到换行),您可以使用 string 模块中的函数 to_integer(String) 对其进行评估:

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

      还有list_to_integer(String) BIF(内置函数,只调用不带模块)但不如string:to_integer(String) 函数宽容:

      list_to_integer(String) -> int()
      

      如果字符串不包含整数,您将收到badarg 异常。

      【讨论】:

        【解决方案3】:
        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]}
        

        就是这样。

        【讨论】:

          【解决方案4】:

          如果使用string:to_integer/1,检查Rest的值是否为空列表[]。该函数从字符串的开头提取整数(如果有)。它不能保证完整的输入转换为整数。

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

          一个例子:

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

          为什么要检查?如果用户的手指滑动并按下 't' 而不是 5,则预期输入是 335,而不是 33。

          【讨论】:

            【解决方案5】:

            尝试使用~w 而不是~p 打印号码:

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

            ~p 格式说明符试图确定列表是否可能是一个字符串,但~w 从不猜测;它总是将列表打印为列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-12-30
              • 1970-01-01
              • 2011-06-19
              • 1970-01-01
              • 2016-06-21
              • 2011-09-09
              • 2019-11-30
              相关资源
              最近更新 更多