Исключение диапазона подстрок Objective-c

#iphone #objective-c #ios #substring #fetch

#iPhone #objective-c #iOS #подстрока #выборка

Вопрос:

Я создаю клиент imap. Я хочу проанализировать тело и заголовок входящих данных, но это приводит к сбою. Я не мог понять, почему он выходит из строя и выдает ошибку substring out of range. Как я могу это исправить?

Я только хочу проверить, содержит ли входящая строка «ВЫБОРКУ», поэтому я анализирую данные, поскольку строка имеет вид * FETCH или * 1 FETCH, я думал, что проверки диапазона isEqualToString, равного (4,6), будет достаточно, но это не сработало.

 - (NSString*) readLine
{
    NSMutableData* data = [[NSMutableData alloc] init];
    unsigned char c;
    for (;;) {
        recv(socket_, amp;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:amp;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: amp;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" <AOLWelcomeInfo@message.aol.com>
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
  

Ответ №1:

Проблема в том, что ваша строка, скорее всего, короче 7 символов, то есть у нее нет индекса 6.

Попробуйте что-нибудь более похожее на это:

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

Ответ №2:

Вы выделяете и инициализируете объект NSData, затем используете этот пустой объект данных для инициализации строки, так что эта строка пуста.

Комментарии:

1. Также существует это …. заполнение ваших данных может заставить его начать работать, но я бы также изменил способ, которым вы выполняете поиск, потому что вы все равно можете получать сбои так, как вы делаете это сейчас.