objective-c cocoa nsstring nsrange

objective c - Extraer una cadena con substringWithRange: da "índice fuera de límites"



objective-c cocoa (2)

El segundo parámetro pasado a NSMakeRange no es la ubicación final, es la longitud del rango.

Entonces, el código anterior intenta encontrar una subcadena que comienza en el primer carácter que sigue a <pre> y termina N caracteres después de eso, donde N es el índice del último carácter anterior dentro de toda la cadena .

Ejemplo: en la cadena "wholeString<pre>test</pre>noMore" ", la primera ''t'' de ''test'' tiene índice 16 (el primer carácter tiene índice 0), y la ''t'' final de ''test'' tiene , por lo tanto, índice 19. El código anterior llamaría NSMakeRange(16, 19) , que incluiría 19 caracteres, comenzando con la primera ''t'' de ''prueba''. Pero solo hay 15 caracteres, inclusive, desde la primera ''t ''de'' prueba ''hasta el final de la cadena. Por lo tanto, obtienes la excepción de fuera de límites.

Lo que necesita es llamar a NSRange con la longitud adecuada. Para el propósito anterior, sería NSMakeRange(match.location+5, match1.location - (match.location+5))

Cuando intento extraer una cadena de una cadena más grande, me da un error de rango o índice fuera de límites. Podría estar pasando por alto algo realmente obvio aquí. Gracias.

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);

ACTUALIZACIÓN: La segunda parte del rango es una longitud, no el punto final. D''oh!


Prueba esto

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 string2, estoy calculando el índice del último carácter.

Salida:

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