为什么d";OCaml scanf格式是否错误?

为什么d";OCaml scanf格式是否错误?,ocaml,Ocaml,当我用ocaml实现read_int函数时(见下文) 如果format参数为%d(无空格),编译器将返回failure,其中包含以下信息: Exception: Scanf.Scan_failure "scanf: bad input at char number 1: ``character '\\n' is not a decimal digit''". 但是如果我使用''%d(前缀加空格),这很好,为什么%d是错误的呢?%d和''%d之间有什么区别。谢谢。scanf格式%d”匹配一个十进

当我用ocaml实现read_int函数时(见下文)

如果format参数为
%d
(无空格),编译器将返回failure,其中包含以下信息:

Exception:
Scanf.Scan_failure
"scanf: bad input at char number 1: ``character '\\n' is not a decimal digit''".

但是如果我使用
''%d
(前缀加空格),这很好,为什么
%d
是错误的呢?
%d
''%d
之间有什么区别。谢谢。

scanf格式
%d”
匹配一个十进制数字字符串。这不包括空白。在
scanf
格式字符串中,空格(
)表示任意数量的空白(空格、制表符、换行符)

因为我不知道你的程序的标准输入上出现了什么,所以不可能准确地说出还有什么在进行。问题可能是上一行末尾出现的
'\n'


更新:不管它值多少钱,我很久以前(在我的C编程时代)就决定
scanf
造成的问题比它解决的问题还多。它在处理输入行时尤其糟糕。最好用另一种方法将输入分成几行,并在结果字符串上使用
sscanf
(或
int\u of_string

scanf格式
%d”
匹配一个十进制数字字符串。这不包括空白。在
scanf
格式字符串中,空格(
)表示任意数量的空白(空格、制表符、换行符)

因为我不知道你的程序的标准输入上出现了什么,所以不可能准确地说出还有什么在进行。问题可能是上一行末尾出现的
'\n'


更新:不管它值多少钱,我很久以前(在我的C编程时代)就决定
scanf
造成的问题比它解决的问题还多。它在处理输入行时尤其糟糕。最好用另一种方法将输入分成几行,并在结果字符串上使用
sscanf
(或
int\u of_string

非常感谢,我明白了,我认为我们应该始终使用“%d”而不是“%d”来防止潜在的错误。我个人倾向于完全避免scanf,并使用真正的词法(例如ocamlex或类似的)。代码通常更易于理解、操作和扩展,并且不应该比手工词法分析慢得多。当然,我倾向于使用
scanf
只用于我打算稍后扔掉的快速测试。使用
printf
的倒数是个好主意,但在实践中效果出奇地糟糕。非常感谢,我明白了,我认为我们应该始终使用“%d”而不是“%d”来防止潜在的错误。我个人倾向于完全避免scanf,并使用真正的词法分析(例如ocamlex或类似的方法)。代码通常更易于理解、操作和扩展,并且不应该比手工词法分析慢得多。当然,我倾向于使用
scanf
只用于我打算稍后扔掉的快速测试。使用printf的倒数是个好主意,但在实践中效果出奇地糟糕。
Exception:
Scanf.Scan_failure
"scanf: bad input at char number 1: ``character '\\n' is not a decimal digit''".