尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

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

1. String 转换为 CString

使用 CString::new() 方法。此操作可能会失败,因此返回一个 Result。
为什么会失败?
C 语言字符串要求空字符 \0 只能出现在字符串的末尾。如果你的 String 中间包含了 \0,CString::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

 

相关新闻

  • 2025年重庆板栗鸡店排行榜,板栗鸡外卖推荐及热门板栗鸡外卖
  • 2025 年 12 月上海静安区泰国菜餐厅最新推荐,聚焦资质、案例、售后的五家品牌深度解读!
  • 2025年言语语言障碍儿童公司权威推荐:资源教室核心装备/随班就读设备配置/智力障碍康复设备服务机构精选

最新新闻

  • 2026年法穆兰官方售后服务体系升级公告:全新官方维修门店新址升级落地,最新服务热线同步开通 - 亨得利中国服务中心
  • Ultimate ASI Loader终极指南:3分钟掌握游戏MOD加载神器
  • 2026年龙华区靠谱的驾校,科技赋能龙华便民驾培!专访宝华驾校 AI 驾驶馆,观平路新联大厦双模式智能教学,服务产业园上班族与青年学子 - GrowthUME
  • 官方最新发布!2026安徽合肥中考分数在普高线上下徘徊?这所学校的综合高中班可以关注 - 小张zc
  • 2026 安徽省宠物护理特色专业招录,咨询方式看最新简章 - cc江江
  • 元气AI助手实战指南:结构化信息处理与工作流嵌入方法

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号