- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经用 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/
我是一名优秀的程序员,十分优秀!