Subcadena con scope fuera de límites?

De acuerdo, entonces esto es un poco confuso (bueno para mí). Tengo una cadena que tiene un solo número que quiero de ella. He rodeado este número con '/' para que pueda get ese número más tarde.

Así es como obtengo el número:

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

Se sigue estrellando y la console dice:

* Aplicación de terminación debido a la exception no detectada 'NSRangeException', razón: '- [__ NSCFString substringWithRange:]: Rango o índice fuera de límites' * Pila de llamadas de primer lanzamiento: (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 a exception

Desde mi count, el scope está dentro de los límites, no entiendo por qué recibo este error.

Cualquier ayuda sería apreciada.

Gracias

Su NSMakeRange (inicio, final) debe ser NSMakeRange (inicio, finalización);

Creo que tienes confusión en la syntax de NSMakeRange. Es algo así

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

<#NSUInteger loc#>: es la location desde donde desea comenzar a elegir o subcadena.

<#NSUInteger len#>: esta es la longitud de su salida o subcadena.

Ejemplo:

Mytest12test

Ahora quiero elegir '12 '

asi que:

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

En tu código en lugar de longitud, estás pasando el índice del carácter final que es tu error.

No sé por qué está utilizando este enfoque, pero iOS proporciona una function de cadena que separa una cadena con respecto a otra cadena y devuelve una matriz de componentes. Vea el siguiente ejemplo:

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

Ahora la cadena de componentes debe tener 2 almacenes.

Cuando el comstackdor se ejecuta en este código …

 else{ end = i + 1; } 

… en la última iteración del ciclo, establece la variable final en uno más que el range de MYSTRING . Es por eso que está recibiendo ese error. Para solucionarlo, simplemente haz esto:

 else{ end = i; } 

¡Espero que esto ayude!

El enfoque de PS Saleh es una forma más sencilla de lograr lo que quieres.

——ACTUALIZAR——

Deberías hacerlo de esta manera:

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