我在Hackerrank尝试了一些编码挑战,我想知道如何使用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)。
我不知道怎么读一行整数,所以如果你能指出我正确的方向,我就能够应对这些挑战!
这是一个从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
已经有好几十年了。)