子字符串在字符串中出现的次数

4
这样查找子字符串的方式可行吗?有没有更有效率的方法?将NSString转化为c字符串时应该使用哪种编码?
在while语句中是否需要使用()!=NULL,虽然它似乎可以正常工作,但当没有找到任何其他出现时,它会跳出循环。
- (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;
}

(这是一个类别方法,因此要在self中搜索字符串。)

这类似于https://dev59.com/PHI95IYBdhLWcg3www2Y NSUTF8StringEncoding是正确的编码。 - Jano
1个回答

8
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++; 
  }
}

+1. 这是唯一的方法,因为它会自动处理Unicode foobar! - JustSid
@JustSid,你说的Unicode foobar是什么意思? - Jonathan.
我的意思是NSString会处理Unicode,而你的代码甚至不允许Unicode,这可能会在你将应用程序投放到国际市场时出现问题。 - JustSid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接