2011-11-08 89 views
1

我正在創建一個imap客戶端。我想解析傳入數據的正文和標題,但它崩潰。我不明白爲什麼它崩潰,並給子串超出範圍的錯誤。我該如何解決它?Objective-c子字符串範圍異常

我只想檢查傳入的字符串是否包含「FETCH」,所以我解析數據,因爲字符串就像 * FETCH或* 1 FETCH我認爲檢查isEqualToString範圍(4,6)就足夠了,但didn沒有工作。

- (NSString*) readLine 
{ 
    NSMutableData* data = [[NSMutableData alloc] init]; 
    unsigned char c; 
    for (;;) { 
     recv(socket_, &c, sizeof(c), 0); 
     if (c == '\n') { 
      NSString* s = [[NSString alloc] initWithData: data 
               encoding: NSUTF8StringEncoding]; 
      NSString *str = [s substringWithRange:NSMakeRange(4, 6)]; 

      if([str isEqualToString:@"FETCH "]){ 
      NSMutableArray *substrings = [NSMutableArray new]; 
       NSScanner *scanner = [NSScanner scannerWithString:s]; 
       [scanner scanUpToString:@"}" intoString:nil]; 
       while(![scanner isAtEnd]) { 
        NSString *substring = nil; 
        [scanner scanString:@"}" intoString:nil]; 
        if([scanner scanUpToString:@"*" intoString:&substring]) { 
         // If the space immediately followed the }, this will be skipped 
         [substrings addObject:substring]; 
        } 
        [scanner scanUpToString:@"}" intoString:nil]; // Scan all characters before next } 
       } 
       NSString *email; 
       [emailList addObject:@"Select an Email"]; 
       for(int i=0; i<substrings.count;i++){ 
        email = [substrings objectAtIndex:i]; 
        [emailList addObject:email]; // add emails in emailList 
       } 
       [substrings release]; 
      } 


      if (nil != s) { 
       NSLog(@"%@",s); 
      } 



      [data release]; 
      return [s autorelease]; 
     } 
      else { 
      [data appendBytes: &c length: 1]; 
     } 
    } 
    return nil; 
} 

輸出爲:

* 1 FETCH (BODY[HEADER.FIELDS (FROM SUBJECT DATE)] {149} 
2011-11-07 23:32:24.363 SwitchDeneme[327:bc03] Date: Mon, 07 Nov 2011 17:00:25 -0500 (EST) 
2011-11-07 23:32:24.364 SwitchDeneme[327:bc03] From: "AOLWelcomeInfo" <[email protected]> 
2011-11-07 23:32:24.365 SwitchDeneme[327:bc03] Subject: Welcome to Your New Email Account! 
2011-11-07 23:32:24.367 SwitchDeneme[327:bc03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFString substringWithRange:]: Range or index out of bounds' 

terminate called throwing an exceptionsharedlibrary apply-load-rules all 

回答

2

的問題是,您的字符串可能超過700個字符短,這意味着它不具備的6

索引嘗試更多的東西是這樣的:

NSRange range = [someString rangeOfString:@"FETCH "]; 
if(range.location != NSNotFound) { 
    //found it... so now do you processing... 
} 
+0

謝謝你,工作得很好 –

0

您分配並初始化一個NSData對象,然後使用該空數據對象來初始化alize一個字符串,以便字符串爲空。

+0

還有一點....填充你的數據可能會使它開始工作,但我也會改變你的搜索方式,因爲你仍然可以按照你的方式現在就做。 –

相關問題