2011-05-18 1 views
28

Lorsque j'essaie d'extraire une chaîne d'une chaîne plus grande, elle me donne une plage ou un index hors limites. Je pourrais oublier quelque chose de vraiment évident ici. Merci.Extraction d'une chaîne avec substringWithRange: donne "index out of bounds"

NSString *title = [TBXML textForElement:title1]; 
TBXMLElement * description1 = [TBXML childElementNamed:@"description" parentElement:item1]; 
NSString *description = [TBXML textForElement:description1]; 
NSMutableString *des1 = [NSMutableString stringWithString:description]; 

//search for <pre> tag for its location in the string 
NSRange match; 
NSRange match1; 
match = [des1 rangeOfString: @"<pre>"]; 
match1 = [des1 rangeOfString: @"</pre>"]; 
NSLog(@"%i,%i",match.location,match1.location); 
NSString *newDes = [des1 substringWithRange: NSMakeRange (match.location+5, match1.location-1)]; //<---This is the line causing the error 

NSLog(@"title=%@",title); 
NSLog(@"description=%@",newDes); 

MISE À JOUR: La 2ème partie de la plage est une longueur, pas le point final. D'oh!

+2

Vous devez mettre votre « solution » comme une réponse et l'accepter. – LucasTizma

Répondre

36

Le deuxième paramètre passé à NSMakeRange n'est pas l'emplacement de fin, c'est la longueur de la plage.

Ainsi, le code ci-dessus essaie de trouver une chaîne qui commence au premier caractère suivant <pre> et se termine N caractères après, où N est l'indice du dernier caractère avant dans l'ensemble chaîne. Exemple: dans la chaîne "wholeString<pre>test</pre>noMore" ", le premier 't' de 'test' a l'index 16 (le premier caractère a l'indice 0), et le 't' final de 'test' a donc l'index 19. Le code ci-dessus appelle NSMakeRange(16, 19), ce qui inclut 19 caractères, en commençant par le premier 't' de 'test', mais il n'y a que 15 caractères inclus, du premier 't' de 'test' jusqu'à la fin de la chaîne . par conséquent, vous obtenez l'exception en dehors des limites.

Qu'est-ce que vous avez besoin est d'appeler NSRange avec la longueur appropriée. aux fins ci-dessus, ce serait NSMakeRange(match.location+5, match1.location - (match.location+5))

6

Essayez ce

NSString *string = @"www.google.com/api/123456?google/apple/document1234/"; 
//divide the above string into two parts. 1st string contain 32 characters and remaining in 2nd string 
NSString *string1 = [string substringWithRange:NSMakeRange(0, 32)]; 
NSString *string2 = [string substringWithRange:NSMakeRange(32, [string length]-[string1 length])]; 
NSLog(@"string 1 = %@", string1); 
NSLog(@"string 2 = %@", string2); 

En chaine2, je calcule l'indice du dernier caractère

Sortie:

string 1 = www.google.com/api/123456?google 
string 2 = /apple/document1234/ 
Questions connexes