微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 nim 中拆分`cstring`

如何解决如何在 nim 中拆分`cstring`

目前,我正在使用 cstring 中的 string 运算符将 $ 转换为 cstrutilsstring.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 举报,一经查实,本站将立刻删除。