2010-09-24 136 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:選項:範圍:和這個做適當次數,而只是增加了起點。