2011-10-16 74 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。這是做到這一點的唯一方法,因爲它會自動處理unicode foobar! – JustSid

+0

@JustSid,你說的unicode foobar是什麼意思? –

+0

我的意思是說,NSString負責處理Unicode,而你的代碼甚至不允許在你將應用程序投放到國際市場後可能會破壞的Unicode。 – JustSid

相關問題