【问题标题】:Objective-c Substring Range ExceptionObjective-c 子字符串范围异常
【发布时间】:2011-11-08 04:56:23
【问题描述】:

我正在创建一个 imap 客户端。我想解析传入数据的正文和标题,但它崩溃了。我不明白为什么它会崩溃并给出子字符串超出范围的错误。我该如何解决?

我只想检查传入的字符串是否包含“FETCH”所以我解析数据,因为字符串就像 * FETCH 或 * 1 FETCH 我认为检查 (4,6) 的 isEqualToString 范围就足够了,但那不起作用。

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

【问题讨论】:

    标签: iphone objective-c ios substring fetch


    【解决方案1】:

    问题是您的字符串可能少于 7 个字符,这意味着它的索引不是 6。

    试试这样的:

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

    【讨论】:

      【解决方案2】:

      您分配并初始化一个 NSData 对象,然后使用该空数据对象初始化一个字符串,使该字符串为空。

      【讨论】:

      • 还有……填充您的数据可能会使其开始工作,但我也会改变您进行搜索的方式,因为您仍然可能会以您正在做的方式失败现在就可以了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2016-05-18
      • 2014-07-23
      • 1970-01-01
      • 2016-11-01
      相关资源
      最近更新 更多