本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。