我正在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)的使用。
虽然我不知道如何读取整数行,所以如果您能指出正确的方向,我将能够应对这些挑战!
答案 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
。)