Substring with range out of bounds?

17,677

Solution 1

Your NSMakeRange(start, end) should be NSMakeRange(start, end- start);

Solution 2

I think you have confusion in syntax of NSMakeRange. It is something like this

NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>)

<#NSUInteger loc#>: It is the location from where you want to start picking or substring.

<#NSUInteger len#>: This is the length of your output or substring.

Example:

Mytest12test

Now I want to pick'12'

so:

NSString *t=@"Mytest12test";
NSString *x=[t substringWithRange:NSMakeRange(6, 2)] ;

In your code instead of length you are passing index of end character that is your mistake.

Solution 3

I don't know why your are using this approach, but iOS provides a string function which separates a string with respect to another string and returns an array of the components. See the following example:

NSString * str = @"dadsada/2/dsadsa";
NSArray *listItems = [str componentsSeparatedByString:@"/"];
NSString *component = [listItems objectAtIndex:1];

Now your component string should have 2 store in it.

Solution 4

When the compiler runs into this code...

else{   
    end = i + 1;
}

... in the last iteration of the loop, it sets the end variable to one more then the range of MYSTRING. This is why you are getting that error. To fix it, just do this:

else{   
    end = i;
}

Hope this helps!

P.S. Saleh's approach is a simpler way of accomplishing what you want

------UPDATE------

You should do it like this actually:

NSMutableArray *occurencesOfSlashes = [[NSMutableArray alloc] init];
char looking = '/';
for(int i=0; i < MYSTRING.length; i++){
if ([MYSTRING characterAtIndex:i] == looking) {
    [occurencesOfSlashes addObject:[NSNumber numberWithInt:i]];  
}
NSString *finalString = [MYSTRING substringWithRange:NSMakeRange([occurencesOfSlashes objectAtIndex:0],[occurencesOfSlashes objectAtIndex:1])];
Share:
17,677
Jacob
Author by

Jacob

Updated on June 21, 2022

Comments

  • Jacob
    Jacob almost 2 years

    Okay, so this is a bit confusing (well to me). I have a string that has a single number I want out of it. I have surrounded this number with '/' so that I will be able to get that number out of it later.

    Here is how I am getting the number out of it:

    if ([MYSTRING hasSuffix:@"mp"]) {
            int start = 0;
            int end = 0;
            char looking = '/';
            for(int i=0; i < MYSTRING.length; i++){
                if (looking == [MYSTRING characterAtIndex:i]) {
                    if (start == 0) {
                        start = i;
                    }
                    else{
                        end = i + 1;
                    }
                }
            }
            NSLog(@"%@", MYSTRING); //When i NSLOG here i get '2012-06-21 03:58:00 +0000/1/mp', 1 is the number i want out of the string, but this number could also change to 55 or whatever the user has
            NSLog(@"start: %i, end: %i", start, end); //When i NSLOG here i get 'start: 25, end: 28'
            NSString *number = [MYSTRING substringWithRange:NSMakeRange(start, end)];
            number = [number stringByReplacingOccurrencesOfString:@"/" withString:@""];
            if ([number intValue] > numberInt) {
                numberInt = [number intValue];
            }
    

    It keeps crashing and the console says:

    * Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range or index out of bounds' * First throw call stack: (0x1875d72 0x106ce51 0x1875b4b 0x184ea64 0x3a6c 0x1080713 0x1bf59 0x1bef1 0xd532e 0xd588c 0xd49f5 0x49a2f 0x49c42 0x290fe 0x1b3fd 0x17d2f39 0x17d2c10 0x17ebda5 0x17ebb12 0x181cb46 0x181bed4 0x181bdab 0x17d1923 0x17d17a8 0x18e71 0x200d 0x1f35) libc++abi.dylib: terminate called throwing an exception

    From my counting the range is within the bounds, I dont get why I am getting this error?

    Any help would be appreciated.

    Thanks

  • Jacob
    Jacob almost 12 years
    I never knew there was such a function, Could you possibly provide a bit of code relative to my example to help me understand exactly how that function works? Thanks for the answer
  • Jasmeet
    Jasmeet about 9 years
    NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>) this made a lot clear