2010-07-16 10 views
0

저는 목표가 C가 처음입니다.NSString 대 C 문자열

이 코드가 제대로 작동하지 않는 이유를 알고 싶습니다. 아이디어는 NSString의 내용을 Cstring으로 복사하는 함수를 만드는 것입니다.

나는, 즉 않은 setattr에게 메시지를 보내 : [자기 않은 setattr을 : @ "뭔가"]

- (BOOL) setAttr:(NSString *) src{ 
const char *dst; 

[ self NSString2CString: src dst: dst ]; 

printf("%s",dst); // <-- gives me junk 
return YES; 
} 


- (BOOL) NSString2CString: (NSString *) src dst: (const char *) dst { 
const char * __src= [src UTF8String]; 
if ((dst=(const char *) malloc(strlen(__src)+ 1)) == NULL) return NO; 
strcpy(dst, __src); 
return YES; 
} 

덕분에 당신은합니다 (address-of operator 사용하여 cstring주소를 전달해야

+0

afcc : 내가받는 C 문자열이 임시 객체에 의해 소유되어 있으며 자동 할당 해제가 발생할 때 유효하지 않으므로 getString과 같은 NSString 메서드를 사용하지 않습니다. 그래서 나는 그것을 복사하고있다. – jhon

+1

"수신기의 콘텐츠를 지정된 인코딩으로 변환하고 버퍼에 저장합니다." * 당신은 * 버퍼를 제공하므로 얼마나 오래 살 수 있습니까? – Wevah

답변

3

-NSString2CString:dst: 메서드에서 dst은 로컬 변수입니다. malloc ~ dst은 발신자에게 다시 반영되지 않습니다.

발신자가 새로운 malloc 에드 포인터를받을 수 있도록하기 위해, 당신은 참조로 전달해야합니다 : BTW

-(BOOL)NSString2CString:(NSString*)src dst:(char**)p_dst { 
//          ^^^^^^^^^^^^^^^^^ 
    ... 
    if ((*p_dst = malloc(...)) == NULL) return NO; 
    strcpy(*p_dst, __src); 
} 
... 
char* dst; 
[self NSString2CString:src dst:&dst]; 

,

  1. 당신이 가지고있는 경우있는 NSString, 돈 ' strlen을 사용하려면 대신 [src length]을 사용하십시오.
  2. 이미 a method called -getCString:maxLength:encoding:이 있습니까?
+0

설명 주셔서 감사합니다 1. 훌륭한 조언 2. 예, 나는 src에 릴리즈 작업을 수행 할 때 메모리의 반환 된 블록이 해제 될 것이라고 생각합니다. 그래서 그 이유는 무엇입니까? 끈. – jhon

+0

@jhon :하지만 적어도 이것으로'strcpy' 호출을 제거 할 수 있습니다. – kennytm

3

&)하지 포인터 :

[ self NSString2CString: src dst: &dst ];

당신의 방법 프로토 타입은 다음과 같아야한다 :

- (BOOL) NSString2CString: (NSString *) src dst: (const char **) dst

그러나 이렇게하는 이유 이미 방법은 -getCString:maxLength:encoding:을 촉구했다 NSString?

+1

이것은 또한 메소드가'const char ** '를 대신 사용하도록 수정되어야 함을 의미합니다. – zneak

+0

설명을 주셔서 감사합니다 – jhon