2011-11-08 15 views
1

私はimapクライアントを作成しています。受信データの本文とヘッダーを解析したいがクラッシュする。私はそれがクラッシュする理由を理解できず、部分文字列が範囲外のエラーを出す。どうすれば修正できますか?Objective-cサブストリング範囲の例外

私だけの着信文字列は1、私はデータを解析し、「FETCH」の文字列が のように来て以来、* FETCHまたは*含まれているかどうかを確認したいが、私は(4,6)のisEqualToString範囲をチェックすることは十分だろうと思ったが、のdidnことFETCH仕事はありません。

- (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

問題は、あなたの文字列が、それはより多くのこのような何かを試してみてください6.

のインデックスを持っていないという意味、7つの文字より可能性が短いことです。

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

ありがとうございました –

0

NSDataオブジェクトを割り当てて初期化し、その空のデータオブジェクトを使用して文字列を空にするように文字列をalizeします。

+0

データがいっぱいになるとデータがうまくいってしまうかもしれませんが、検索のやり方も変えてしまいます今それをやっている。 –

関連する問題