2010-09-24 4 views
0

J'essaie de créer une fonction qui me dira la plage d'une chaîne lors d'une occurrence. Par exemple, si j'avais la chaîne "bonjour, bonjour, bonjour", je veux connaître la plage de bonjour à, disons, la troisième occurrence.Plage de chaînes NSString à l'occurrence

J'ai essayé de construire cette fonction simple, mais cela ne fonctionne pas.

Remarque - les fonctions supérieures ont été construites à une date antérieure et fonctionnent correctement.

Toute aide appréciée.

- (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

Ce serait génial si vous pouviez s'il vous plaît corriger votre indentation afin qu'il nous soit plus facile de comprendre la structure de votre code d'un coup d'oeil. – AlcubierreDrive

Répondre

5

Au lieu de couper la chaîne un tas de fois (lent), il suffit d'utiliser rangeOfString:options:range:, qui recherche uniquement dans la plage passée en son troisième argument. Voir Apple's documentation.

Donc, essayez:

- (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

Merci pour cela :) Je vois enfin ce que je fais mal. –

2

Vous devez retravailler l'ensemble du code. Bien que cela puisse sembler fonctionner, c'est un mauvais codage et tout à fait faux, comme la réaffectation permanente de la même variable, l'initialisation mais la réaffectation d'une ligne plus tard, libérant après le retournant (qui ne fonctionnera jamais).

Pour votre question: Utilisez simplement rangeOfString: options: range :, et faites-le le nombre de fois approprié en incrémentant simplement le point de départ.