Подстрока с диапазоном за пределами?

Хорошо, так что это немного сбивает с толку (хорошо для меня). У меня есть строка с одним номером, который я хочу из нее. Я окружил это число знаком "/"; так что я смогу вытащить это число позже.

Вот как я получаю число из этого:

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];
        }

Он продолжает падать, и консоль говорит:

* 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

Из моего подсчета диапазон находится в пределах, я не понимаю, почему я получаю эту ошибку?

Любая помощь будет оценена.

Спасибо

 Jacob21 июн. 2012 г., 06:33
О, я только сделал это, так что это заметно для вас, ребята :), это не так в коде
 Michael Dautermann21 июн. 2012 г., 06:31
кто-то другой, вероятно, собирается ответить на ваш вопрос довольно быстро, но я хотел бы отметить одну вещь: a.s.a.p. былоnever используйте все заглавные буквы (или заглавные буквы) в имени переменной, например & quot;MYSTRING& Quot ;. Все заглавные буквы могут быть подходящими для констант, но другой предпочтительный стиль - это префикс константы с K (или строчными буквами k)

Ответы на вопрос(4)

почему вы используете этот подход, но iOS предоставляет строковую функцию, которая разделяет строку по отношению к другой строке и возвращает массив компонентов. Смотрите следующий пример:

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

Теперь в вашей компонентной строке должно быть 2 хранилища.

 Jacob21 июн. 2012 г., 06:38
Я никогда не знал, что есть такая функция. Не могли бы вы предоставить немного кода относительно моего примера, чтобы помочь мне понять, как именно работает эта функция? Спасибо за ответ

что у вас есть путаница в синтаксисе NSMakeRange. Это как то так

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

<#NSUInteger loc#>: Это место, откуда вы хотите начать сбор или подстроку.

<#NSUInteger len#>: Это длина вашего вывода или подстроки.

Пример:

Mytest12test

Теперь я хочу выбрать «12».

так:

NSString *[email protected]"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.

 11 февр. 2015 г., 14:13
NSMakeRange (& lt; #NSUInteger loc # & gt ;, & lt; #NSUInteger len # & gt;) это прояснило многое
 Jacob21 июн. 2012 г., 06:47
О, это имеет больше смысла

else{   
    end = i + 1;
}

... в последней итерации цикла устанавливает конечную переменную равной единицеmore тогда диапазонMYSTRING, Вот почему вы получаете эту ошибку. Чтобы это исправить, просто сделайте это:

else{   
    end = i;
}

Надеюсь это поможет!

Постскриптум Подход Салеха - это более простой способ выполнить то, что вы хотите

------ОБНОВИТЬ------

Вы должны сделать это так на самом деле:

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])];
 Jacob21 июн. 2012 г., 06:42
я все еще ошибаюсь при этом: /
Решение Вопроса

конец) должен быть NSMakeRange (начало, конец-начало);

 Jacob21 июн. 2012 г., 06:46
Работал!! Спасибо

Ваш ответ на вопрос