我的目标是扫描一个包含冒号作为分隔符的字符串,并将它的两个部分保存在一个元组中。
例如:
input: "a:b"
output: ("a", "b")
到目前为止,我的方法不断收到错误消息:
“scanf:第 9 个字符的错误输入:正在寻找 ':',找到 '\n'”。
Scanf.bscanf Scanf.Scanning.stdin "%s:%s" (fun x y -> (x,y));;
此外,我的方法适用于整数,我很困惑为什么它不适用于字符串。
Scanf.bscanf Scanf.Scanning.stdin "%d:%d" (fun x y -> (x,y));;
4:3
- : int * int = (4, 3)
最佳答案
您看到问题的原因是第一个 %s
将继续消耗输入,直到出现 following conditions 之一。持有:
- 找到一个空格,
- 遇到扫描指示,
- 已到达输入结束。
请注意,看到冒号并不能满足其中任何一项(如果您不使用扫描指示)。这意味着第一个 %s
将消耗所有内容,在您的情况下,输入缓冲区中的换行符,然后 :
将失败。
%d:%d
没有同样的问题,因为 %d
不会使用冒号作为匹配整数的一部分。
您可以改用不使用冒号的格式字符串来解决此问题,例如 %[^:]:%s
。您也可以使用 scanning indication ,就像这样:%s@:%s
.
此外,您当前的方法不会占用缓冲区中的任何尾随空格,这可能会导致在后续使用时将换行符添加到第一个元素,因此您可能更喜欢 %s@:%s\n
使用换行符。
总之,
Scanf.bscanf Scanf.Scanning.stdin "%s@:%s\n" (fun x y -> (x,y));;
关于string - 使用 scanf 在非空白分隔符上拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72834074/