2010-09-24 144 views
0

我试图建立一个函数,它会告诉我一个字符串在一个事件的范围。NSString的字符串范围发生

例如,如果我有字符串“你好,你好,你好”,我想知道打招呼的范围在它的,可以说,第三次出现的。

我试过建立这个简单的功能,但它不起作用。

注 - 顶部功能在较早的日期和做工精细构建。

任何帮助表示赞赏。

- (NSString *)stringByTrimmingString:(NSString *)stringToTrim toChar:(NSUInteger)toCharacterIndex { 

    if (toCharacterIndex > [stringToTrim length]) return @""; 

    NSString *devString = [[[NSString alloc] init] autorelease]; 

    for (int i = 0; i <= toCharacterIndex; i++) { 

    devString = [NSString stringWithFormat:@"%@%@", devString, [NSString stringWithFormat:@"%c", [stringToTrim characterAtIndex:(i-1)]]]; 

    } 

    return devString; 

    [devString release]; 
    } 

- (NSString *)stringByTrimmingString:(NSString *)stringToTrim fromChar:(NSUInteger)fromCharacterIndex { 
    if (fromCharacterIndex > [stringToTrim length]) return @""; 
    NSString *devString = [[[NSString alloc] init] autorelease]; 
    for (int i = (fromCharacterIndex+1); i <= [stringToTrim length]; i++) { 
     devString = [NSString stringWithFormat:@"%@%@", devString, [NSString stringWithFormat:@"%c", [stringToTrim characterAtIndex:(i-1)]]]; 
    } 
    return devString; 
    [devString release]; 
} 



- (NSRange)rangeOfString:(NSString *)substring inString:(NSString *)string atOccurence:(int)occurence { 

    NSString *trimmedString = [inString copy]; //We start with the whole string. 
    NSUInteger len, loc, oldLength; 
    len = 0; 
    loc = 0; 


    NSRange tempRange = [string rangeOfString:substring]; 
    len = tempRange.length; 
    loc = tempRange.location; 

    for (int i = 0; i != occurence; i++) { 

     NSUInteger endOfWord = len+loc; 

     trimmedString = [self stringByTrimmingString:trimmedString fromChar:endOfWord]; 

     oldLength += [[self stringByTrimmingString:trimmedString toChar:endOfWord] length]; 

     NSRange tmp = [trimmedString rangeOfString:substring]; 
     len = tmp.length; 
     loc = tmp.location + oldLength; 

    } 

    NSRange returnRange = NSMakeRange(loc, len); 

    return returnRange; 

} 
+1

如果您可以请修复您的缩进,这将是非常好的,所以我们更容易理解代码的结构。 – AlcubierreDrive 2010-09-24 09:25:54

回答

5

相反修剪串一堆倍(慢)的,只要使用rangeOfString:options:range:,其只搜索作为其第三个参数传递的范围内。请参阅Apple's documentation

所以尝试:

- (NSRange)rangeOfString:(NSString *)substring 
       inString:(NSString *)string 
      atOccurence:(int)occurence 
{ 
    int currentOccurence = 0; 
    NSRange rangeToSearchWithin = NSMakeRange(0, string.length); 

    while (YES) 
    { 
    currentOccurence++; 
    NSRange searchResult = [string rangeOfString: substring 
             options: NULL 
              range: rangeToSearchWithin]; 

    if (searchResult.location == NSNotFound) 
    { 
     return searchResult; 
    } 
    if (currentOccurence == occurence) 
    { 
     return searchResult; 
    } 

    int newLocationToStartAt = searchResult.location + searchResult.length; 
    rangeToSearchWithin = NSMakeRange(newLocationToStartAt, string.length - newLocationToStartAt); 
    } 
} 
+0

谢谢你:)我终于明白我在做什么错了。 – 2010-09-24 09:43:48

2

你需要返工整个代码。虽然它看起来可能工作,但是它的编码很糟糕,并且显然是错误的,例如永久重新分配相同的变量,初始化但稍后重新分配一行,在返回之后释放(这将不会工作)。

对于你的问题:只需使用rangeOfString:选项:范围:和这个做适当次数,而只是增加了起点。