Iphone Objective-c子字符串范围异常
我正在创建一个imap客户端。我想解析传入数据的主体和标题,但它崩溃了。我不明白为什么它会崩溃,并给出子字符串超出范围的错误。我怎样才能修好它 我只想检查传入的字符串是否包含“FETCH”,所以我解析数据,因为字符串 *FETCH或*1 FETCH我认为检查(4,6)的IsequalString范围就足够了,但这不起作用Iphone Objective-c子字符串范围异常,iphone,objective-c,ios,substring,fetch,Iphone,Objective C,Ios,Substring,Fetch,我正在创建一个imap客户端。我想解析传入数据的主体和标题,但它崩溃了。我不明白为什么它会崩溃,并给出子字符串超出范围的错误。我怎样才能修好它 我只想检查传入的字符串是否包含“FETCH”,所以我解析数据,因为字符串 *FETCH或*1 FETCH我认为检查(4,6)的IsequalString范围就足够了,但这不起作用 - (NSString*) readLine { NSMutableData* data = [[NSMutableData alloc] init]; uns
- (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;
}
-(NSString*)读线
{
NSMutableData*数据=[[NSMutableData alloc]init];
无符号字符c;
对于(;;){
recv(插座和c,尺寸为(c),0);
如果(c=='\n'){
NSString*s=[[NSString alloc]initWithData:data
编码:NSUTF8StringEncoding];
NSString*str=[s substringWithRange:NSMakeRange(4,6)];
if([str isEqualToString:@“FETCH”]){
NSMUTABLEARRY*子字符串=[NSMUTABLEARRY new];
NSScanner*scanner=[NSScanner scannerWithString:s];
[scanner scanuptString:@“}”intoString:nil];
而(![scanner isattend]){
NSString*子字符串=nil;
[扫描仪扫描字符串:@“}”intoString:nil];
if([scanner scanuptString:@“*”intoString:&子字符串]){
//如果空间紧跟在}之后,将跳过此操作
[子字符串添加对象:子字符串];
}
[scanner scanuptString:@“}”intoString:nil];//在下一步之前扫描所有字符}
}
NSString*电子邮件;
[emailList addObject:@“选择电子邮件”];
对于(int i=0;i而言,问题在于您的字符串可能短于7个字符,这意味着它没有6的索引
尝试类似以下内容:
NSRange range = [someString rangeOfString:@"FETCH "];
if( range.location != NSNotFound ) {
//found it... so now do you processing...
}
您分配并初始化一个NSData对象,然后使用该空数据对象初始化一个字符串,使该字符串为空。还有一个问题……填充数据可能会使它开始工作,但我也会改变您执行搜索的方式,因为您现在执行搜索的方式仍然可能失败。
NSRange range = [someString rangeOfString:@"FETCH "];
if( range.location != NSNotFound ) {
//found it... so now do you processing...
}