如何解决如何在 nim 中拆分`cstring`
目前,我正在使用 cstring
中的 string
运算符将 $
转换为 cstrutils
。 string.split
模块中有一个 strutils
。
有没有办法分割 cstring
例如
let a : cstring = "hello world"
let b = a.split("o")
# let b = ($a).split("o")) # work `$a` is string.
解决方法
C 字符串只是一个 C 字符串,它是一个指向以 char(0),\x0 结尾的字符块的指针。
在 Nim 中,当我们使用需要 C 字符串作为参数的 C 库时,主要使用 C 字符串。 Nim 字符串是一个具有长度字段和数据缓冲区的不透明对象,它以零结尾并与 C 字符串兼容,因此我们可以将该缓冲区传递给 C 库。因此,从 Nim 字符串中我们可以免费获得 Cstring,但是从 C 字符串中获得 Nim 字符串意味着分配一个新实体并复制内容。
C 语言本身没有很多处理字符串的操作,我们必须使用库,例如来自 gtk 的 glib。拆分一个 C 字符串意味着分配两个新字符串,或者至少分配一个新字符串并将 \x0 插入旧字符串以标记结束。 C 字符串的问题通常是,当我们分配它们时,我们必须注意释放它以避免内存泄漏。
所以建议是:从一开始就使用 Nim 字符串。您可以直接将它们传递给 C 库,Nim 编译器很聪明并传递实际缓冲区。在大多数情况下,C 库会创建字符串的副本。如果不是,并且 C lib 将在内部使用实际的 C 字符串,则您必须注意 Nim 字符串不会被 Nim GC 过早释放,可能在字符串上调用 gc_ref()。在极少数情况下,您可能想在 Nim 中真正使用 C 字符串,也许是为了节省内存?当您知道不想对该字符串进行操作时,您可以这样做,例如附加、拆分、替换以及 Nim 字符串提供的所有操作。 Nim 初学者手册中有一节是关于 Nim 字符串和 C 字符串的,参见 http://ssalewski.de/nimprogramming.html#_strings
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。