rust 将Vector转换< String>为CString

pdkcd3nj  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

我想选择一个参数给我的程序,将其转换为CString,并将其作为零终止的const char*传递给C函数。

let args: Vec<String> = env::args().collect();
let arg1 = args[1];
let arg1copy = CString::new(&arg1).unwrap();
external_c_func(arg1copy.as_ptr());

字符串
但是我得到了“the trait From<&String> is not implemented for String”。如果我用一个常量String“like this”替换args[1],它确实有效。
我该怎么做才合适呢?像这样简单的事情却需要如此多的投资,真令人厌烦。

r9f1avp5

r9f1avp51#

所以,我们在这里:

  • 对于实现Into<Vec<u8>>的每个数据结构,实现CString::new(即,可以在不复制缓冲器的内容的情况下将其转变为Vec<u8>);
  • String实现了Into<Vec<u8>>;
  • 但是这里,您所拥有的不是String,而是&String-您可以从它创建一个Vec<u8>,但是这将需要一个缓冲区副本,因此它不会实现“Into;
  • 之所以有一个&String,是因为您操作的是指向数组中某个项的指针,而不是项本身。

有很多方法可以摆脱它。

只需复制字符串

若要从&String取得String,请呼叫.clone()。这会复制内存中字串的内容。

let args: Vec<String> = std::env::args().collect();
let arg_1 = &args[1];
let arg_1_copy = CString::new(arg_1.clone()).unwrap();

external_c_func(arg_1_copy.as_ptr());

字符串
不要把它放在一个向量摆在首位

let mut args = std::env::args();
let arg_1 = args.next().unwrap();
let arg_1_copy = CString::new(arg1).unwrap();

external_c_func(arg_1_copy.as_ptr());

将其从向量中移除

let args: Vec<String> = std::env::args().collect();
let arg_1 = args.remove(0);
let arg_1_copy = CString::new(arg_1).unwrap();

external_c_func(arg_1_copy.as_ptr());

改为构建CString的向量

let conversions: Result<Vec<CString>, _> = std::env::args().map(CString::new).collect();
let args = conversions.unwrap();
external_c_func(args[0].as_ptr());


相关问题