关于在OCaml中读取整数/字符串输入的问题

时间:2019-04-16 20:36:40

标签: ocaml

我正在Hackerank中尝试一些编码挑战,我想知道如何使用OCaml读取一行以空格分隔的整数。 我知道输入整数是否以换行符分隔,  然后我们可以做

let recread_lines () =
    try line = read_line ()
    in line:: read_lines()
with End_of_file->[]

,然后使用

将列表转换为int列表
let ()= 
let input = read_lines () 
in List.map int_of_string input.

我还知道我们可以通过执行以下操作从整数行中读取第一个整数:

let n1 =Scanf.scanf " %d" (fun x -> x)

从C中,我知道scanf方法会扫描该行以查找参数中定义的结构,然后将扫描的值存储到变量中。我在OCaml的scanf方法的末尾看不到(fun x-> x)的使用。

虽然我不知道如何读取整数行,所以如果您能指出正确的方向,我将能够应对这些挑战!

1 个答案:

答案 0 :(得分:0)

这是一个从stdin读取一行以空格分隔的整数的函数:

let read_ints () =
    let line = read_line () in
    let ints = Str.split (Str.regexp "  *") line in
    List.map int_of_string ints

如果输入中没有更多行,则此函数将引发End_of_file

如果实际上有制表符与空格混合(例如),则可以调整正则表达式。

(多年来,我发现scanf函数家族在遇到意外输入时很容易表现不良。特别是对于OCaml来说,这不是问题,所有语言都一样拥有scanf。所以几十年来我一直没有使用scanf。)