当前位置: 首页 > news >正文

rust与c语言字符串相互转换总结

在 Rust 中,String 和 CString 分别用于不同的目的,因此它们的转换涉及内存布局所有权的变化
  • String:Rust 原生的、UTF-8 编码的、动态增长的字符串智能指针。
  • CString:与 C 语言兼容的字符串智能指针。它是一个以空字符(Null Terminator, \0)结尾的字节序列。

1. String 转换为 CString

使用 CString::new() 方法。此操作可能会失败,因此返回一个 Result
为什么会失败?
C 语言字符串要求空字符 \0 只能出现在字符串的末尾。如果你的 String 中间包含了 \0CString::new() 会返回一个 Err(NulError)
use std::ffi::CString;fn rust_to_c(data: String) -> CString {// CString::new 返回 Result,需要使用 expect 或 match 来处理错误let c_string = CString::new(data).expect("String 不能包含内部空字符(\\0)");c_string
}fn main() {let s = String::from("Hello, C world!");let c_str = rust_to_c(s);println!("CString 成功创建: {:?}", c_str);// let bad_s = String::from("Null\0Byte");// CString::new(bad_s).expect("这将导致程序崩溃"); 
}

2. CString 转换为 String

有两种主要方式,取决于你是想获取所有权还是仅获取引用。 
A. 获取所有权 (将 CString 消费掉)
使用 .into_string() 方法。此操作也返回一个 Result
为什么会失败?
虽然 CString 保证以 \0 结尾,但它不保证其内部字节是有效的 UTF-8 编码。String 必须是有效的 UTF-8。如果字节无效,会返回 Err(IntoStringError)
use std::ffi::CString;fn c_to_rust_owned(c_string: CString) -> String {// 将 CString 转换为 String,并消费掉 CStringlet rust_string = c_string.into_string().expect("CString 不是有效的 UTF-8 编码");rust_string
}// 完整示例结合:
let s = String::from("Hello");
let c_str = CString::new(s).unwrap();
let s_back = c_to_rust_owned(c_str);
println!("转换回来的 String: {}", s_back);
B. 获取引用 (从 &CStr 获取 &str)
如果你只需要读取 CString 的内容,可以获取它的引用 &CStr,然后转换为 Rust 的字符串切片 &str
  • 使用 .as_c_str() 获得 &CStr 引用。
  • 使用 .to_str() 获得 &str 引用(同样需要处理 UTF-8 错误)。
use std::ffi::{CStr, CString};fn c_ref_to_rust_ref(c_str: &CStr) -> &str {// 转换为 &str 引用,需要处理 UTF-8 错误let rust_slice = c_str.to_str().expect("CStr 不是有效的 UTF-8");rust_slice
}// 完整示例:
let c_str = CString::new("Example").unwrap();// 获取一个临时的 &CStr 引用
let rust_slice = c_str.as_c_str(); 
let final_str = c_ref_to_rust_ref(rust_slice);println!("引用方式转换: {}", final_str);
总结表格
 
方向使用方法返回类型(需错误处理)注意事项
String -> CString CString::new(s) Result<CString, NulError> String 中不能有 \0
CString -> String c_str.into_string() Result<String, IntoStringError> 字节必须是 UTF-8
&CStr -> &str c_str.to_str() Result<&str, Utf8Error> 字节必须是 UTF-8

参考资料:

1.rust字符串数据类型String、str、CString和CStr

 

http://www.jsqmd.com/news/66785/

相关文章:

  • 2025年靠谱的 GEO 公司推荐:官方深度测评必读
  • 2025年度十大竹制家具供应商排行榜,竹制品厂家哪家好
  • 2025年中国外墙砖品牌排行榜:迪泉外墙砖防滑性如何
  • 2025 年 12 月上海静安区泰国菜餐厅最新推荐,聚焦资质、案例、售后的五家品牌深度解读!
  • 2025年重庆板栗鸡店排行榜,板栗鸡外卖推荐及热门板栗鸡外卖
  • 基于FPGA的QPSK+卷积编码Viterbi译码通信系统开发,包含帧同步,高斯信道,误码统计,可设置SNR
  • 2025年武汉五大西点西餐职业教育机构排行榜,新东方西点西餐
  • 2025年中国五大防盗门售后服务公司推荐:北京春天防盗门值得
  • 2025年中国全域外卖服务商排行榜:全域外卖招商有哪家?
  • 2025年葡萄牙名义雇主EOR公司推荐,Safeguard Global人力资源服务商助力企业合规雇佣
  • 2025年抖音外卖服务商TOP5推荐:斯创全域外卖售后服务与
  • CF2009E-Klees SUPER DUPER LARGE Array!!!
  • 2025年言语语言障碍儿童公司权威推荐:资源教室核心装备/随班就读设备配置/智力障碍康复设备服务机构精选
  • 2025年工业酒精经销商哪家好/代理加工厂哪个值得选/哪家专
  • 2025年东南亚自然风、简约地中海与古典装修风格三大流派TO
  • 2025 南美名义雇主 EOR 服务商推荐:Safeguard Global 合规用工优选
  • 2025 年 12 月 GEO 服务商精选:深度实测的靠谱企业名单
  • 实用指南:Kubernetes 第四章:深入掌握Service-基础
  • 2025年中国数字文化展馆设计公司TOP5推荐:国创展览发展
  • 详细介绍:STM32—— 嵌入式微控制器入门
  • 2025仓储货架厂家排行:四大维度筛选靠谱供应商
  • 2025年MMA彩色防滑路面服务排名,mma彩色防滑路面服务
  • 2025年12月AI智搜GEO推广服务商权威推荐榜:福州、莆田、三明地区智能搜索优化与排名实战解析
  • 2025实力强的全域外卖运营商TOP5权威推荐:高性价比的全
  • 2025 年 12 月 GEO 推荐:服务响应高效的核心优质标杆
  • 详细介绍:算法通关指南:数据结构和算法篇 --- 队列相关算法题》--- 1. 【模板】队列,2. 机器翻译
  • 2025年企业出海意大利新选择!推荐Safeguard Global名义雇主EOR人力资源服务商
  • 2025年蔡司数码型镜片代理商权威推荐榜单:蔡司觉体验店‌/国际眼镜城蔡司‌/蔡司北京眼镜城‌‌源头代理商精选
  • 2025年分选铝渣设备源头厂家权威推荐:分选铝灰设备/花岗岩制砂设备/分选不锈钢渣设备源头厂家综合评析
  • FlashAttention(1):从内存模型到 Online Softmax