为了能够使用C库,我需要为函数提供*mut c_char
参数。但我找不到从str
获得它的方法。
我将我的str转换为CString,这没关系,但是CString在夜间构建中没有更多的方法来获得*mut c_char
。我发现在0.12.0中有一个method,但现在,获得*mut c_char
的过程是什么?
答案 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 documentation,fn 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();
我认为有点复杂