2011-10-16 5 views
4

하위 문자열의 발생 횟수를 확인하는 방법으로 적합합니까? 더 이상 효율적으로 만들 수 있습니까? NSString에서 C 문자열로 이동하려면 어떤 인코딩을 사용해야합니까?문자열의 하위 문자열 발생 횟수

while 문에서 ()!=NULL에 대해 100 % 확신하지는 않습니다. 정상적으로 작동하는 것으로 보이고 더 이상 발생하지 않으면 while 루프가 중단됩니다.

- (NSUInteger)occurenceOfString:(NSString *)substring { 
    const char *substr = [substring cStringUsingEncoding:NSUTF8StringEncoding]; 
    const char *selfstr = [self cStringUsingEncoding:NSUTF8StringEncoding]; 
    unsigned long substrlen = strlen(substr); 
    NSUInteger count = 0; 
    char * ptr; 
    while ((ptr = strstr(selfstr, substr)) != NULL && substr != '\0') { 
     count++; 
     substr += substrlen + *ptr; 
    } 
    return count; 
} 

(자체적으로 검색되는 문자열이므로 카테고리 방법입니다.)

+0

이 http://stackoverflow.com/questions/2166809/number-of-occurrences-of-a-substring-in-an-nsstring NSUTF8StringEncoding 비슷 오른쪽 부호화된다. – Jano

답변

7
NSUInteger cnt = 0, length = [str length]; 
NSRange range = NSMakeRange(0, length); 
while(range.location != NSNotFound) 
{ 
    range = [str rangeOfString: @"substr" options:0 range:range]; 
    if(range.location != NSNotFound) 
    { 
    range = NSMakeRange(range.location + range.length, length - (range.location + range.length)); 
    cnt++; 
    } 
} 
+0

+1. 이것은 자동으로 유니 코드 foobar를 처리하므로이 작업을 수행하는 유일한 방법입니다! – JustSid

+0

@ JustSid, 유니 코드 foobar에 대해 무엇을 의미합니까? –

+0

NSString이 유니 코드 처리를 담당하는 반면, 코드가 유니 코드를 허용하지 않는 경우에도 국제 시장에서 앱을 버리면 깨질 수 있습니다. – JustSid