2015-01-22 1 views
2

C 라이브러리를 사용하려면 함수에 *mut c_char 매개 변수를 지정해야합니다. 하지만 str에서 가져갈 방법을 찾지 못했습니다.Str에서 * mut c_char를 얻으려면 어떻게해야합니까?

나는 str을 CString으로 바꿨다. 괜찮 았지만, CString에서 야간 빌드에 *mut c_char을 얻는 방법은 없다. 나는 0.12.0에서 method가 있었지만, 지금은 그 과정을 무엇입니까 *mut c_char 찾았나요?

+0

어떤 종류의 문자열을 가지고 있습니까? '& str' 또는'String'입니까? – Shepmaster

+0

C 함수의 시그니처를 포함하십시오. 메서드 호출 방법에 대한 자세한 내용이 포함되어 있습니다. 특히, 함수가 문자열에 얼마나 많은 공간이 있는지를 알기 때문에 할당 된 메모리를 지나치게 확장하지 않는지 궁금합니다. – Shepmaster

+0

이상하게도'CString'는'Output = [c_char]'를 사용하여'DerefMut' 구현을 할 것이기 때문에'c_str.as_mut_ptr()'만으로'* mut c_char'를 얻을 수 있습니다. 그러나 그런 구현이 없다는 이유는'CString'을 깨뜨릴 수 있다는 것입니다. 왜냐하면'CString'은 내부에 0을 포함하지 않는다는 것을 보장합니다.이 경우'c_str [2] = 0'가 가능할 것입니다. 그래서, 제 생각에, 여러분의'Vec' 기반 솔루션은 괜찮습니다; C API에 0으로 끝나는 문자열이 필요한 경우 끝에 0 바이트를 푸는 것을 잊지 마십시오. –

답변

2
let bytes = String::from_str("Test").into_bytes() + b"\0"; 
let cchars = bytes.map_in_place(|b| b as c_char); 
let name: *mut c_char = cchars.as_mut_ptr(); 

기본적인 생각은 당신과 동일하지만, 명시 적으로 Vec를 슬라이스 할 필요가 없다는; 또한 0 바이트가 버퍼에 추가됩니다. 질문에 대한 내 의견도 참조하십시오.

+0

전화 해 주셔서 감사합니다. 사실 더 좋았습니다. ^^ 항상 좋습니다 ^^ – Peekmo

1

fn as_mut_ptr() API 부분으로 이동되었습니다. 따라서 &mut [c_char] 유형의 가변 슬라이스가 필요합니다. AFAIK는 CString에서 가져올 수 없으며 읽기 전용입니다. 내 문제를 해결하기 위해 로드리고의 게시물에

let mut x : Vec<c_char> = ...; 
let slice = x.as_mut_slice(); 
let ptr = slice.as_mut_ptr(); 
0

감사합니다, 나는 방법 발견 (매우 더러운하지만 작동) :

대신 당신은 mut Vec<c_char>가 사용할 수 있습니다. 여기에 코드입니다 :

let mut string = std::string::String::from_str("Test"); 
let bytes = string.into_bytes(); 
let mut cchar : Vec<c_char> = bytes.map_in_place(|w| w as c_char); 
let slice = cchar.as_mut_slice(); 
let name: *mut c_char = slice.as_mut_ptr(); 

내 의견에 약간의 복잡한

+0

좋은데,'map_in_place'를 생략 할 수 있다고 생각합니다. 어쩌면 컴파일러는'u8'과'c_char' (일명'i8')가 비트 동일 코드 인 IIANM을 보장하기 때문에 그 코드를 최적화 할 수 있습니다. – rodrigo

+0

아니요, map_in_place없이 컴파일하지 않습니다.) – Peekmo

+0

내 말은'name : * mut u8'을 선언하고 이에 따라 API 가져 오기 코드를 변경할 수 있으며 모두 올바르게 작동해야한다는 것입니다. 또는 어쩌면 당신은'transmute()'할 수 있지만 정확한 규칙을 모르겠습니다. – rodrigo

관련 문제