crate libc;
use std::ffi::CStr;
use std::ffi::CString;
use libc::c_char;
//use std::slice;
#[no_mangle]
pub extern "C" fn string_from_rust(s: *const libc::c_char) -> *const libc::c_char {
let c_str = unsafe { CStr::from_ptr(s) }; // из *const libc::c_char в CStr
let p_str = match c_str.to_str() { // из CStr в &str
Err(_) => " ",
Ok(string) => string,
};
let v: Vec<&str> = (*p_str).split(' ').collect(); // из &str в str
let s2 = CString::new(v[0]).unwrap();
let s3 = unsafe { std::str::from_utf8_unchecked(std::slice::from_raw_parts(s2.as_ptr() as *const u8, 2)) };
println!("s3 = {:?}",&s3);
//std::mem::forget(&s3);
s3.as_ptr() as *const c_char
}
fn main() {
let s = string_from_rust("f ff".as_ptr() as *const libc::c_char );
let c_str = unsafe { CStr::from_ptr(s) }; //.as_ptr()
print!("{:?}",c_str.to_str());
}
не сильно уверен что там дальше происходит, но CStr::from_ptr из раст строки это уже UB
Обсуждают сегодня