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) |