Извлечение строки с substringWithRange: дает «индекс вне границ» - PullRequest
29 голосов
/ 19 мая 2011

Когда я пытаюсь извлечь строку из большей строки, это дает мне ошибку диапазона или индекса за пределами границ.Я мог бы пропустить что-то действительно очевидное здесь.Спасибо.

<code>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: @"
"]; NSLog (@"% i,% i ", match.location, match1.location); NSString * newDes = [des1 ​​substringWithRange: NSMakeRange (match.location + 5, match1.location-1)]; // <--- Это строка, вызывающая ошибку NSLog (@ "title =% @", title); NSLog (@ "description =% @", newDes); </code>

ОБНОВЛЕНИЕ: 2-ая часть диапазона - это длина, а не конечная точка. Черт!

Ответы [ 2 ]

39 голосов
/ 19 мая 2011

Второй параметр, переданный NSMakeRange, не является конечным местоположением, это длина диапазона.

Таким образом, приведенный выше код пытается найти подстроку, которая начинается с первого символа, следующего за <pre>, а заканчивается N символов после этого, где N - индекс последний символ перед всей строкой .

Пример: в строке "wholeString<pre>test</pre>noMore" ", первый 't' из 'test' имеет индекс 16 (первый символ имеет индекс 0), а последний 't' из 'test' имеет, следовательно, индекс 19. Код выше вызовет NSMakeRange(16, 19), что включает 19 символов, начиная с первого «t» из «test». Но есть только 15 символов включительно, от первого «t» из «test» до конца строки. Таким образом, вы получаете выход за пределы исключение.

Вам нужно вызвать NSRange соответствующей длины. Для вышеуказанной цели это было бы NSMakeRange(match.location+5, match1.location - (match.location+5))

6 голосов
/ 04 июня 2015

Попробуйте это

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

В строке 2 я вычисляю индекс последнего символа

Вывод:

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