Тип c_char
Тип c_char представляет собой символ в стиле языка C
и используется при взаимодействии с внешними функциями
через FFI. В отличие от Rust-типа char, который
всегда занимает 4 байта и хранит Unicode-скаляр,
c_char соответствует типу char из C
и обычно занимает 1 байт. Тип c_char является
знаковым или беззнаковым в зависимости от платформы,
поэтому его не следует использовать для хранения
Unicode-символов. Параметров у типа нет, так как это
примитивный тип-псевдоним.
Синтаксис
use std::os::raw::c_char;
let x: c_char = 65;
Пример
Давайте создадим переменную типа c_char
и выведем её значение:
use std::os::raw::c_char;
fn main()
{
let x: c_char = 65;
println!("{}", x);
}
Результат выполнения кода:
65
Пример
Давайте преобразуем массив байтов в C-строку и выведем её содержимое:
use std::os::raw::c_char;
use std::ffi::CStr;
fn main()
{
let bytes: [c_char; 6] = [104, 101, 108, 108, 111, 0];
let c_str = unsafe { CStr::from_ptr(bytes.as_ptr()) };
let res = c_str.to_str().unwrap();
println!("{}", res);
}
Результат выполнения кода:
"hello"
Пример
Давайте передадим C-строку в функцию, имитирующую внешний C-код, и получим её длину:
use std::os::raw::c_char;
unsafe fn c_strlen(s: *const c_char) -> usize
{
let mut len = 0;
while *s.offset(len as isize) != 0 {
len += 1;
}
len
}
fn main()
{
let bytes: [c_char; 6] = [104, 101, 108, 108, 111, 0];
let res = unsafe { c_strlen(bytes.as_ptr()) };
println!("{}", res);
}
Результат выполнения кода:
5