當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust CStr用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 Struct std::ffi::CStr。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。