string - 使用 scanf 在非空白分隔符上拆分字符串

标签 string split io ocaml scanf

我的目标是扫描一个包含冒号作为分隔符的字符串,并将它的两个部分保存在一个元组中。
例如:

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/

相关文章:

python - 从字符串中的数字中拆分字母

c - 读取并收集文本文件中的变量

ruby - Ruby 中的 to_s 与 to_str(以及 to_i/to_a/to_h 与 to_int/to_ary/to_hash)

c++ - 将调用推送到 STL 队列 <std::string> 会在从套接字读取字符串时导致段错误

python - Numpy 字符串分区 : Perform Multiple Splits

c - 如何将 STDIN 保持在 C 终端的底部

c# - 进行网络 I/O 时 Stream.Read 是否被缓冲?

java - 从字符串中提取各种格式的日期?

c++ - String 和 Bool(Int 条件为假)C++

python - 如何用新行和冒号解析一行?