提问人:Evan Carroll 提问时间:11/6/2023 最后编辑:cafce25Evan Carroll 更新时间:11/6/2023 访问量:78
如何使用 Rust 将 CString 转换为字符串?
How do I convert a CString into a String with Rust?
问:
我有一个正在从磁盘读取的 CString。我用 CStr::from_bytes_until_nul
创建了它。不过,我的最终目标是拥有 ,而不是 .我正在尝试将我的存储到需要 .有没有从CString转换为String的方法?String
CString
CString
String
CString 是拥有的,并且似乎,
- 保证没有内在
\0
- 保证有终端
\0
A也是拥有的。似乎,String
- 保证内容是 utf8。
为什么没有 from CString to String,它拉出终端并换行?.try_into()
\0
str::from_utf8(mycstring)
答:
1赞
frankenapps
11/6/2023
#1
您可以使用 to_str(
) 将 CString
转换为 String,成功时会为您提供一个 &str
(例如,u 只包含有效的 UTF-8 字符),然后可以通过调用 to_string()
将其转换为
String
。CString
下面是一个简短的示例:
let cstring = CString::new("A string.").unwrap();
let string = cstring.to_str().unwrap().to_string();
以及 Rust Explorer 的链接。
关于你的第二个问题,我认为没有理由不应该进行转换,所以我的推测是,到目前为止,它根本没有实施。Github 上还有一个开放问题,正是要求这样做。try_into
评论
0赞
Evan Carroll
11/6/2023
虽然这是通过转换为切片,然后转换为字符串来工作的,但您正在制作副本,对吧?没有副本就不可能吗?
0赞
Cerberus
11/6/2023
它不应该。 确切地知道它在被丢弃时必须释放多少字节,但在语义上必须再丢弃一个字节(终止零)。因此,我们不能只是将一个的分配重用到另一个 - 大小不匹配。String
CString
2赞
Chayim Friedman
11/6/2023
@Cerberus可以保存大于其长度的分配。String
4赞
Aleksander Krauze
11/6/2023
#2
有方法本身into_string,它完全可以做你想做的事情。CString
评论
1赞
Evan Carroll
11/6/2023
谢谢,奇怪的是这是它自己的名字。
评论