当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。