本文简要介绍rust语言中 Struct std::ffi::CStr
的用法。
用法
pub struct CStr { /* fields omitted */ }
借用的 C 字符串的表示。
此类型表示对 nul-terminated 字节数组的借用引用。它可以从 &[u8]
切片安全地构造,也可以从原始 *const c_char
不安全地构造。然后可以通过执行 UTF-8 验证将其转换为 Rust &str
,或转换为拥有的 CString
。
&CStr
与 CString
的关系正如&str
与 String
的关系一样:每对中的前者都是借用的引用;后者是自有字符串。
注意这个结构是不是 repr(C)
不建议放在FFI函数的签名中。相反,FFI 函数的安全包装器可能会利用不安全的函数std::ffi::CStr.from_ptr构造函数为其他消费者提供安全的接口。
例子
检查外部 C 字符串:
use std::ffi::CStr;
use std::os::raw::c_char;
extern "C" { fn my_string() -> *const c_char; }
unsafe {
let slice = CStr::from_ptr(my_string());
println!("string buffer size without nul terminator: {}", slice.to_bytes().len());
}
传递 Rust-originating C 字符串:
use std::ffi::{CString, CStr};
use std::os::raw::c_char;
fn work(data: &CStr) {
extern "C" { fn work_with(data: *const c_char); }
unsafe { work_with(data.as_ptr()) }
}
let s = CString::new("data data data data").expect("CString::new failed");
work(&s);
将外部 C 字符串转换为 Rust String
:
use std::ffi::CStr;
use std::os::raw::c_char;
extern "C" { fn my_string() -> *const c_char; }
fn my_string_safe() -> String {
unsafe {
CStr::from_ptr(my_string()).to_string_lossy().into_owned()
}
}
println!("string: {}", my_string_safe());
相关用法
- Rust CStr.into_c_string用法及代码示例
- Rust CString.into_bytes用法及代码示例
- Rust CStr.from_bytes_with_nul用法及代码示例
- Rust CStr.from_bytes_with_nul_unchecked用法及代码示例
- Rust CString.from_raw用法及代码示例
- Rust CString.into_boxed_c_str用法及代码示例
- Rust CString.into_raw用法及代码示例
- Rust CString.as_c_str用法及代码示例
- Rust CString.from_vec_unchecked用法及代码示例
- Rust CStr.from_ptr用法及代码示例
- Rust CString.from_vec_with_nul_unchecked用法及代码示例
- Rust CString.from_vec_with_nul用法及代码示例
- Rust CString.as_bytes用法及代码示例
- Rust CStr.to_bytes用法及代码示例
- Rust CStr.as_ptr用法及代码示例
- Rust CString用法及代码示例
- Rust CStr.to_str用法及代码示例
- Rust CString.into_bytes_with_nul用法及代码示例
- Rust CString.as_bytes_with_nul用法及代码示例
- Rust CString.new用法及代码示例
- Rust CString.into_string用法及代码示例
- Rust CStr.to_string_lossy用法及代码示例
- Rust CStr.to_bytes_with_nul用法及代码示例
- Rust Cursor.new用法及代码示例
- Rust Condvar.notify_all用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::ffi::CStr。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。