15 个版本
0.7.2 | 2021年4月5日 |
---|---|
0.7.1-已废弃 | 2017年12月20日 |
0.7.0 | 2015年4月4日 |
0.6.2 | 2015年3月27日 |
#3 在 #nul
每月下载 28 次
18KB
331 行
Rust 的 C 字符串辅助工具
废弃通知
此包不再维护。如果您只使用它来使用 c_str!
宏,请考虑切换到 c_str_macro
或 byte-strings
。
lib.rs
:
此库提供用于与 FFI 调用一起使用创建和管理空终止字符串的辅助工具。大多数 C API 要求传递给它们的字符串是空终止的,其中许多分配并返回空终止字符串,但 Rust 的内置字符串类型 不是 空终止的。
将 Rust 字符串转换为 C 字符串的另一个问题是,Rust 字符串可以在字符串中间有效包含一个空字节(0 是一个有效的 Unicode 代码点)。这意味着并非所有 Rust 字符串都可以实际转换为 C 字符串。
管理由外部分配的 C 字符串
通过类型 OwnedCString
管理分配的 C 字符串。此类型的值“拥有”内部字符缓冲区,并在值被丢弃时调用析构函数。
C 字符串的创建
类型 CStrBuf
用于将 Rust 字符串数据适配到调用期望空终止字符串的 C 函数。CStrBuf
的转换构造函数提供生成 C 字符串的多种方式,但由于上述某些限制,转换可能会失败。
借用 C 字符串
无论是 OwnedCString
还是 CStrBuf
,都委派到 std::ffi::CStr
,这是一个无大小类型,当通过引用传递或返回时,会断言 C 字符串要求。&CStr
可用于在安全的伪装下封装 FFI 函数。
创建和使用 C 字符串的示例
extern crate c_string;
extern crate libc;
use c_string::CStrBuf;
use std::ffi::CStr;
fn safe_puts(s: &CStr) {
unsafe { libc::puts(s.as_ptr()) };
}
fn main() {
let my_string = "Hello, world!";
// Allocate the C string with an explicit local that owns the string.
// The string will be deallocated when `my_c_string` goes out of scope.
let my_c_string = match CStrBuf::from_str(my_string) {
Ok(s) => s,
Err(e) => panic!(e)
};
safe_puts(&my_c_string);
}
依赖关系
~43KB