gpt4 book ai didi

encoding - 如何用字符串更新 libc::c_char 数组?

转载 作者:行者123 更新时间:2023-11-29 08:04:15 24 4
gpt4 key购买 nike

我已经用 C/C++ 编写了一些 FFI 代码,

use libc::c_char;
use std::ffi::CString;

type arr_type = [c_char; 20]; // arr_type is the type in C
let mut arr : arr_type = [0; 20];

let s = "happy123";
let c_s = CString::new(s).unwrap();
let s_ptr = c_s.as_ptr();

如何更新 arr使用字符串 s ?在 C/C++ 中我可以使用 memcpy , strcpy等等……

我尝试了很多,比如使用 rlibc::memcpy 并发现它不能与 libc.. 一起使用,但是编译器不让我通过,Rust 中关于数组的信息很少。


添加:阅读回复后,我想添加一些信息和更多问题。

1.

在 C++ 中,我使用 strcpy_s将字符串复制到字符数组,因为字符串的长度和数组的大小都是已知的。

下面两种方法我都试过了。

std::iter::Zip方法,看起来很像strcpy_s ,但我不知道是否会影响性能。

copy_nonoverlapping方法,它使用 as_mut_ptr()将数组转换为指针则没有长度信息,因为它在 unsafe { } 中 block ,我尝试复制一个比数组更长的字符串,但没有错误显示……我想知道这样可以吗?

Rust 中是否有像 C++ 中的 strcpy_s 那样的函数?

2.

我正在使用 windows 和 msvc,对于 char 数组,我的意思是 not deal with encoding或使用 default codepage encoding .

以下在源文件中都可以:

C++:

std::string s = "world is 世界";
std::wstring ws = L"world is 世界";

Qt:

QString qs = QStringLiteral("world is 世界");

python 3:

s = 'world is 世界'

但是在 Rust 中,下面可能是错误的?正如我在 Eclipse 调试窗口中看到的那样。

let s = "world is 世界";

我找到了 rust-encoding 并尝试了这些:

use encoding::{Encoding, EncoderTrap};
use encoding::all::GB18030;

let s = "world is 世界";
let enc = GB18030.encode(&s , EncoderTrap::Strict);

在 Rust 中有更好的方法吗?

最佳答案

这是一种不需要不安全代码的解决方案,但不幸的是,大多数方法都被标记为不稳定。

#![feature(libc)]
#![feature(core)]
#![feature(collections)]

extern crate libc;

use libc::c_char;
use std::ffi::CString;
use std::slice::IntSliceExt;

type arr_type = [c_char; 20];

fn main() {
let mut c_string: arr_type = [0; 20];
let value = CString::new("happy123").unwrap();

c_string.clone_from_slice(value.as_bytes_with_nul().as_signed());
}

关于encoding - 如何用字符串更新 libc::c_char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29278089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com