我想选择一个参数给我的程序,将其转换为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]
,它确实有效。
我该怎么做才合适呢?像这样简单的事情却需要如此多的投资,真令人厌烦。
1条答案
按热度按时间r9f1avp51#
所以,我们在这里:
Into<Vec<u8>>
的每个数据结构,实现CString::new
(即,可以在不复制缓冲器的内容的情况下将其转变为Vec<u8>
);String
实现了Into<Vec<u8>>
;String
,而是&String
-您可以从它创建一个Vec<u8>
,但是这将需要一个缓冲区副本,因此它不会实现“Into;&String
,是因为您操作的是指向数组中某个项的指针,而不是项本身。有很多方法可以摆脱它。
只需复制字符串
若要从
&String
取得String
,请呼叫.clone()
。这会复制内存中字串的内容。字符串
不要把它放在一个向量摆在首位
型
将其从向量中移除
型
改为构建CString的向量
型
等