2013-08-08 4 views
0

Я написал код для замены delete подстроки в NSString ... моя логика заключалась в том, чтобы использовать «rangeofString», чтобы найти положение каждого символа подстроки, а затем использовать «ReplaceOccurance» для замените символы подстроки пробелом, а затем перечеркните символ пробела. Но я получаю сообщение об ошибке в строке replaceOccurance какNSRangeException даже правильный диапазон в NSString Замените

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceOccurrencesOfString:withString:options:range:]: Range or index out of bounds' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff85614b06 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff83c4e3f0 objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff856148dc +[NSException raise:format:] + 204 
    3 CoreFoundation      0x00007fff85613520 -[__NSCFString replaceOccurrencesOfString:withString:options:range:] + 224 
    4 Foundation       0x00007fff8d433a12 -[NSString stringByReplacingOccurrencesOfString:withString:options:range:] + 170 
    5 tester        0x00000001000019a1 deleteWithSubstring + 865 
    6 tester        0x0000000100001d35 main + 133 
    7 libdyld.dylib      0x00007fff89e267e1 start + 0 
    8 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminate called throwing an exception.... 

Вот мой код.

NSString* deleteWithSubstring(NSString *s1,NSString *sub) 
{ 
    long int length=[sub length],range=0; 
    NSRange r; 
    for(int i=0;i<length;i++) 
    { 
     range=[s1 rangeOfString:[NSString stringWithFormat:@"%c",[sub characterAtIndex:i]]options:NSCaseInsensitiveSearch range:NSMakeRange(range,[s1 length]-1)].location; 


     r=NSMakeRange(range,[s1 length]-1); 
     NSLog(@"%ld %ld",r.location,r.length); 
     if(range!=NSNotFound) 
     { 
      s1=[s1 stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%c",[sub characterAtIndex:i]] withString:@" " options:NSCaseInsensitiveSearch range:r]; 
     } 
    } 
    s1=[s1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    return s1; 
} 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 


     NSString *str1,*str2; 
     [email protected]"Hdida"; 
     [email protected]"fHsdai"; 

     NSLog(@"Loc B:%@ ",,deleteWithSubstring(str2,@"ha")); 


    } 
    return 0; 
} 

На самом деле я решил проблему с range..as переписывания кода сочтя seocond аргумент не UpperBound, а это длина ..which должно быть следующим

NSString* deleteWithSubstring(NSString *s1,NSString *sub) 
    { 
     long int length=[sub length],range=0,ndeleted=0; 
     NSMutableString *s2=[[NSMutableString alloc]initWithString:s1]; 
     NSRange r; 
     for(int i=0;i<length;i++) 
     { 
      range=[s1 rangeOfString:[NSString stringWithFormat:@"%c",[sub characterAtIndex:i]]options:NSCaseInsensitiveSearch range:NSMakeRange(range,[s1 length]-range)].location; 


      r=NSMakeRange((range-ndeleted),1); 
      NSLog(@"%ld %ld" ,r.location,r.length); 
      if(range!=NSNotFound) 
      { 
       [s2 deleteCharactersInRange:r]; 
       ndeleted++; 
      } 
     } 

     NSLog(@"%@",s2); 
     return s2; 
    } 

ответ

0

Попробуйте следующий код,

NSString* deleteWithSubstring(NSMutableString *s1,NSString *sub) 
{ 

    NSRange r; 
    for(int i = 0; i < [s1 length]; i++) 
    { 
     //findout the range with "sub" string 
     r = [s1 rangeOfString:sub options:NSCaseInsensitiveSearch]; 

     if(r.location != NSNotFound) 
     { 
      //Delete the characters in that range 
      [s1 deleteCharactersInRange:r]; 
     } 
     else 
     { 
      //break the loop if sub string not found as there is no more recurrence. 
      break; 
     } 
    } 
    return s1; 
} 

int main(int argc, char *argv[]) 
{ 

    @autoreleasepool { 
     //initiating str1 here 
     NSMutableString* str1 = [[NSMutableString alloc] init]; 
     [str1 appendString:@"fHsdaihati"]; 

     NSLog(@"Loc B:%@ ",deleteWithSubstring(str1,@"ha")); 
    } 
    return 0; 
} 
+0

я уже нашел решение ..explained выше спасибо за вашу помощь :-) – Raon

+0

с текущего кода, что вы хотите сделать? просто для устранения проблемы сбоя? Или также удалить подстроку из str1? – shuvo

+0

Если я передаю fHsdaihati как str1, я получил «fsdihati» из метода deleteWithSubstring. Это ваш желаемый результат? Потому что на нем есть «ha» подстрока (fsdihati) – shuvo