2011-05-18 15 views
28

Daha büyük bir dizeden bir dize ayıklamak istediğimde, bana bir hata veya sınır dışı hatası verir. Burada gerçekten belirgin bir şey görüyor olabilirim. Teşekkürler.Bir dizgeyi substringWithRange ile ayıklamak: "dizin dışına çıkma" verir

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

GÜNCELLEME: aralığının 2 kısmı uzunluğu değil uç noktasıdır. D'oh!

+2

Sen bir cevap olarak "çözüm" koymak ve onu kabul etmelidir. – LucasTizma

cevap

36

NSMakeRange'a iletilen ikinci parametre son konum değil, aralığın uzunluğu.

Yani yukarıdaki kod N bütün dize içinde önceki son karakterin endeksidir <pre> ve N karakter bundan sonra biter sonraki ilk karakteri en başlar bir alt bulmaya çalışır.

Örnek: "wholeString<pre>test</pre>noMore" dizgisinde "," 'testin' ilkinin 'indeksi 16 (ilk karakterin dizin 0'ı vardır) ve' t 'son' t 'değeri, bu nedenle, dizin 19'a sahiptir. Yukarıdaki kod, "test" in ilk 't' i ile başlayan, 19 karakter içeren NSMakeRange(16, 19)'u çağırır. Ancak, 'testin' ilkinden 't' sonuna kadar sadece 15 karakter vardır. . bu nedenle, sınırları istisna out olsun.

uygun uzunlukta NSRange çağırmaktır gerekenler. yukarıdaki amaçla, NSMakeRange(match.location+5, match1.location - (match.location+5))

6

deneyin olurdu dize2 bu

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

, ben geçen karakterin dizinini hesaplanırken am

Çıktı:

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