当前位置: 首页 > 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.rkmt.cn/news/77326.html

相关文章:

  • 2025年重庆板栗鸡店排行榜,板栗鸡外卖推荐及热门板栗鸡外卖
  • 2025 年 12 月上海静安区泰国菜餐厅最新推荐,聚焦资质、案例、售后的五家品牌深度解读!
  • 2025年言语语言障碍儿童公司权威推荐:资源教室核心装备/随班就读设备配置/智力障碍康复设备服务机构精选
  • 2025年工业酒精经销商哪家好/代理加工厂哪个值得选/哪家专
  • 2025年东南亚自然风、简约地中海与古典装修风格三大流派TO
  • 2025年12月AI智搜GEO推广服务商权威推荐榜:福州、莆田、三明地区智能搜索优化与排名实战解析
  • 2025年MMA彩色防滑路面服务排名,mma彩色防滑路面服务
  • 2025年蔡司数码型镜片代理商权威推荐榜单:蔡司觉体验店‌/国际眼镜城蔡司‌/蔡司北京眼镜城‌‌源头代理商精选
  • 2025年分选铝渣设备源头厂家权威推荐:分选铝灰设备/花岗岩制砂设备/分选不锈钢渣设备源头厂家综合评析
  • FlashAttention(1):从内存模型到 Online Softmax
  • 2025年12月制造业咨询公司推荐:行业评测榜与选型对比指南
  • 2025年专业市场洞察公司排名,市场洞察哪家公司好
  • 2025年五大液压打包机源头厂家排行榜,专业液压打包机生产厂
  • 2025年中国真空上料机生产厂家排名:推荐一下真空上料机制造
  • 2025年特装搭建厂家综合实力推荐:展厅设计施工/特装展台搭建/展台设计搭建源头服务商精选
  • 实用指南:Epoll 服务器实战教学:从 Poll 到高性能事件驱动模型
  • 2025年10月企业管理培训公司推荐:行业领先机构排行分析
  • 2025年10月制造业企业管理咨询公司推荐:综合实力排名与对比评价
  • 国标GB28181算法算力平台EasyGBS在物业视频安防管理服务中的应用方案
  • 2025年纱线开松机源头厂家推荐:纱线开松机服务商有哪些?
  • 2025年冲锋衣棉服优质供应商/加工厂/生产商十大排行榜,精
  • 2025南通装修公司TOP5权威推荐:性价比高的装修公司有哪
  • 深度剖析Answer与KoalaQA的差异化竞争:从基础问答社区到智能业务中台的全面进化路径解析
  • 2025年度优质石笼网厂商推荐,石笼网批发加工厂哪家技术强全
  • 2025特种集装箱供应商TOP5权威推荐:特种集装箱生产厂哪
  • 2025年廊坊燕郊执照注销机构权威推荐榜单:燕郊会计服务‌/燕郊税务注销‌/燕郊社保咨询‌‌源头机构精选
  • 2025年最值得信赖的大牌美妆小样供应链品牌盘点,口碑好的大牌美妆小样供应链解析品牌实力与甄选要点
  • 2025 广元购买商标平台怎么选?4 大核心指标对比,教你选对平台
  • 绵阳购买商标公司的平台哪家靠谱?2025 权威榜单公布 + 避坑指南
  • 202最新富氢水供应商 / 厂家 TOP5 评测!行业专业数据市场口碑及优质品牌选择指南,科技赋能 + 健康生态权威榜单发布,引领健康饮水新革命