OCaml-read_int和Scanf之间的差异

OCaml-read_int和Scanf之间的差异,ocaml,Ocaml,我想知道以下两者之间的区别: let b = read_int();; 及 ? 此外,为什么Scanf将函数作为条目 主要区别在于,如手册中所述,read\u int读取整行,并期望整行(当然最后的\n除外)包含在整数中,而根据scan\u int的定义,整数后面可以有一些非数字字符 Scanf.Scanf的函数参数允许您对输入执行任意转换。简而言之,Scanf模块提供了一种从抽象字符源读取多个输入的方法。例如,以下函数从字符串中读取两个由=字符分隔的字符串输入: let f string =

我想知道以下两者之间的区别:

let b = read_int();;

?


此外,为什么Scanf将函数作为条目

主要区别在于,如手册中所述,
read\u int
读取整行,并期望整行(当然最后的
\n
除外)包含在整数中,而根据
scan\u int
的定义,整数后面可以有一些非数字字符


Scanf.Scanf
的函数参数允许您对输入执行任意转换。

简而言之,
Scanf
模块提供了一种从抽象字符源读取多个输入的方法。例如,以下函数从字符串中读取两个由
=
字符分隔的字符串输入:

let f string = Scanf.sscanf string "%s@=%s" (fun x y -> x, y )
assert (f "x=y" = "x","y")
函数参数提供了一种通用方法,可以将scanf函数读取的多个输入组合到一个输出中

因此,它是
pervisives
中提供的少数
read
函数的一种泛化,这些函数只能逐行读取一个输入,并且只能从pervisives
中的一个通道中读取整行内容。整行必须只包含一个整数

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)    |
缓冲区中剩余的内容通常会妨碍下一次扫描。我建议您不要在未知输入上使用scanf

关于所需的标识函数,这是因为scanf可能具有非常复杂的格式字符串,这将创建复杂的数据。无法猜测您希望如何返回该数据。可以使用元组,但在特定情况下,OCaml不支持任意展平产品。我们称之为延续,这项工作做得又好又有效

| line in stdin | read_int | scanf " %d"     |
|---------------|----------|-----------------|
| "1234"        | 1234     | 1234            |
| " 1234"       | ERROR    | 1234            |
| "1234 foo"    | ERROR    | 1234 (foo left) |
| "0xff"        | 255      | 0 (xff left)    |