如何从Str获得* mut c_char?

时间:2015-01-22 17:07:52

标签: rust

为了能够使用C库,我需要为函数提供*mut c_char参数。但我找不到从str获得它的方法。

我将我的str转换为CString,这没关系,但是CString在夜间构建中没有更多的方法来获得*mut c_char。我发现在0.12.0中有一个method,但现在,获得*mut c_char的过程是什么?

4 个答案:

答案 0 :(得分:2)

let bytes = String::from_str("Test").into_bytes() + b"\0";
let cchars = bytes.map_in_place(|b| b as c_char);
let name: *mut c_char = cchars.as_mut_ptr();

基本思路与你的基本思路相同,但不需要明确地对Vec进行切片;还将一个零字节附加到缓冲区。另见我对该问题的评论。

答案 1 :(得分:1)

查看this piece of documentationfn as_mut_ptr()已移至API的 slice 部分。所以你需要一个&mut [c_char]类型的可变片。而AFAIK你不能从CString得到那些,那些是只读的。

相反,您可以使用mut Vec<c_char>

let mut x : Vec<c_char> = ...;
let slice = x.as_mut_slice();
let ptr = slice.as_mut_ptr();

答案 2 :(得分:1)

五年后,这些解决方案都不起作用(至少对我而言)。

稍加修改的 this answer 版本:

let string: &str = "Hello, world!";
let bytes: Vec<u8> = String::from(string).into_bytes();
let mut c_chars: Vec<i8> = bytes.iter().map(| c | *c as i8).collect::<Vec<i8>>();

c_chars.push(0); // null terminator

let ptr: *mut c_char = c_chars.as_mut_ptr();

答案 3 :(得分:0)

感谢罗德里戈的帖子,我找到了一种方法(非常脏,但它有效)来解决我的问题。这是代码:

let mut string = std::string::String::from_str("Test");
let bytes = string.into_bytes();
let mut cchar : Vec<c_char> = bytes.map_in_place(|w| w as c_char);
let slice = cchar.as_mut_slice();
let name: *mut c_char = slice.as_mut_ptr();

我认为有点复杂