OCaml - read_int和Scanf之间的区别

JKL*_*JKL 3 ocaml

我想知道之间有什么区别:

let b = read_int();;
Run Code Online (Sandbox Code Playgroud)

let scan_int () = Scanf.scanf " %d" (fun x -> x)
Run Code Online (Sandbox Code Playgroud)

此外,为什么Scanf将一个功能作为一个条目?

Pat*_*atJ 10

read_int ()读取整行,将整行更改为整数.整行必须只包含一个整数.

Scanf.scanf " %d" (fun x -> x)也读取整行,在行的开头处删除空格,然后读取以十进制表示法写入的整数.如果该整数后面有字符,它们将保留在缓冲区中.

这是一张桌子:

| line in stdin | read_int | scanf " %d"     |
|---------------|----------|-----------------|
| "1234"        | 1234     | 1234            |
| " 1234"       | ERROR    | 1234            |
| "1234 foo"    | ERROR    | 1234 (foo left) |
| "0xff"        | 255      | 0 (xff left)    |
Run Code Online (Sandbox Code Playgroud)

缓冲区中剩下的内容通常会妨碍您的下一次扫描.我建议你不要在未知输入上使用scanf.

关于所需的身份功能,这是因为scanf可能具有非常复杂的格式字符串,这将创建复杂的数据.您希望如何返回返回的数据无法猜到.可以使用元组,但OCaml在该特定情况下不支持任意扁平化产品.给予我们所谓的延续,可以很好地有效地完成工作.