2016-09-23 2 views
0

나는 NSArray<NSString*>* 개체를 가지고 있으며 문자열 배열을 char**으로 취하는 C API를 호출해야합니다.NSString의 배열을 C- 문자열의 배열로 변환하는 방법은 무엇입니까?

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 중요한 노트는 C - 문자열이 const 수정이 없어야합니다, 그래서 다음과 같은 일이 UTF8String 반환 const char* 이후 충분하지 않습니다 :

NSArray<NSString*>* names = ...; 
int len = args.count; 
char* cNames[len]; 
for(int i = 0; i < len; i++) { 
    cNames[i] = names[i].UTF8String; 
}; 
+0

C API가 문자열의 내용을 변경합니까? – kennytm

+0

나는 그렇게 생각하지 않지만 이론적으로는 그렇게 할 수있다. – zeroimpl

+1

그렇다면 아무것도 원래 NSArray를 수정하게됩니다. 위는 기본적으로 올바른 접근 방식입니다. 지루한'malloc'과'strncpy'를 추가하여 전체 복사본을 만들고 싶을뿐입니다. 답은 위와 C에 있습니다. –

답변

1

당신은 당신이 의지 할 수 없기 때문에 일부 동적 메모리를 수행 할 것 UTF8String 용 백업 메모리가 릴리스되었습니다.

NSArray *strings = @[ @"String 1", @"Other string", @"Random String"]; 
char **cStrings = NULL; 
NSInteger numCStrings = strings.count; 

if (numCStrings) { 
    cStrings = (char **)calloc(numCStrings, sizeof(char*)) ; 

    if (cStrings) { 
     // Safer to allocate memory for each string 

     for (NSInteger i=0;i<numCStrings;i++) { 
      NSString *nsString = strings[i]; 
      char *cString = (char *)malloc([nsString lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1); // + 1 for \0 

      if (cString) { 
       strcpy(cString, nsString.UTF8String); 
       cStrings[i] = cString; 
      } else { 
       // You should handle your error 
      } 
     } 
    } else { 
     // You should handle your error 
    } 
} 

for (NSInteger i=0;i<numCStrings;i++) { 
    NSLog(@"C-String (%ld): %s", i, cStrings[i]); 
} 

// Note you need to free your memory later! 
// Do any additional setup after loading the view, typically from a nib. 
for (NSInteger i=0;i<numCStrings;i++) { 
    if (cStrings[i]) { 
     // Free each string 
     free(cStrings[i]); 
    } 
} 

// Free the array 
free(cStrings); 

cStrings = NULL; 
numCStrings = 0; 
+0

감사합니다. 추악하지만 나는해야 할 것 같아요! – zeroimpl

+0

하나의 작은 수정 -'nsString.length'는 UTF-16 인코딩의 길이를 반환합니다. '[nsString lengthOfBytesUsingEncoding : NSUTF8StringEncoding]'을 사용해야합니다. – zeroimpl

관련 문제