-> *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 mut str1 = (*p_str).split_whitespace(); // из &str в str
let mut str2 = str1.next();
str2 = str1.next();
str2.unwrap().as_ptr() as *const libc::c_char
}
fn main() {
let s = string_from_rust("fff привет".as_ptr() as *const libc::c_char );
let c_str = unsafe { CStr::from_ptr(s) };
print!("{:?}",c_str.to_str().unwrap());
}
высвечивает:
"приветcalled Option::unwrap() on a None valuecalled Result::unwrap() on an Err value src/main.rs"
то есть лишнее добавляет после "привет" (только при русских буквах)
Как исправить ?
тут УБ, в контракте CStr::from_ptr написано, что строка должна быть нуль-терминирована, "fff привет" — не нуль-терминирована
Обсуждают сегодня