我想知道之间有什么区别:
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在该特定情况下不支持任意扁平化产品.给予我们所谓的延续,可以很好地有效地完成工作.