Вопрос по nsstring, objective-c, ios – Подстрока с диапазоном за пределами?

7

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

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

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

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

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

Спасибо

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

Ваш Ответ

4   ответа
6

что у вас есть путаница в синтаксисе 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.

О, это имеет больше смысла Jacob
NSMakeRange (& lt; #NSUInteger loc # & gt ;, & lt; #NSUInteger len # & gt;) это прояснило многое
2

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

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

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

Я никогда не знал, что есть такая функция. Не могли бы вы предоставить немного кода относительно моего примера, чтобы помочь мне понять, как именно работает эта функция? Спасибо за ответ Jacob
1

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])];
я все еще ошибаюсь при этом: / Jacob
24

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

Работал!! Спасибо Jacob

Похожие вопросы