首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在锈病中将char**转换为Vec<String>

如何在锈病中将char**转换为Vec<String>
EN

Stack Overflow用户
提问于 2019-08-15 09:13:49
回答 2查看 1K关注 0票数 3

我有一个生锈静态库,它在c++项目中被链接。它在很大程度上运作良好。但是,我不知道如何将c char*数组传递到铁锈中,并将其转换为锈蚀Vec。

我的C代码:

代码语言:javascript
复制
int rust_main(int argc, char** argv);

int main(int argc, char **argv)
{
    rust_main(argc, argv);
    return 0;
}

我的铁锈密码:

代码语言:javascript
复制
#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , argv : &[*mut c_char]) -> c_int {

    let arglen = argc as usize;
    println!("Args: {}", argc);


    for x in 0..arglen {
        let var = CString::from_raw(argv[x]);
        let printable = var.to_string_lossy();
        println!("{}", x);
    }
}

但是,当我试图访问字符串指针数组时,代码编译得很好,我得到了一个Core转储。

如果有人能为我指明正确的方向,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-15 09:40:03

来自文档

其他使用(例如,试图获取由外部代码分配的字符串的所有权)可能会导致未定义的行为或分配器损坏。 注意:如果您需要借用由外部代码分配的字符串,请使用CStr。

您应该调用CStr::from_ptr,然后根据需要使用to_strto_string_lossyinto_c_string转换为拥有的值。

代码语言:javascript
复制
#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , argv : &[*mut c_char]) -> c_int {

    let arglen = argc as usize;
    println!("Args: {}", argc);


    for x in 0..arglen {
        let var = CStr::from_ptr(argv[x]);
        let printable = var.to_string_lossy();
        println!("{}", x);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-08-16 09:52:04

您不能与C代码共享片(实际上是不可能的)。

我试着做一个例子,可以将argv转换为String

代码语言:javascript
复制
use libc::{c_char, size_t, c_int};
use std::ffi::CStr;
use std::slice::from_raw_parts;
use std::str::Utf8Error;

pub unsafe fn convert_double_pointer_to_vec(
    data: &mut &mut c_char,
    len: size_t,
) -> Result<Vec<String>, Utf8Error> {
    from_raw_parts(data, len)
        .iter()
        .map(|arg| CStr::from_ptr(*arg).to_str().map(ToString::to_string))
        .collect()
}


#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , data: &mut &mut c_char) -> c_int {
    let argv = convert_double_pointer_to_vec(data, argc as size_t);

    if let Ok(mut argv) = argv {
        for (i, arg) in argv.iter_mut().enumerate() {
            arg.insert_str(0, &format!("{}: ", i));
        }

        println!("{:#?}", argv);

        0
    }
    else {
        1
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57507413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档