2012-06-21 12 views
7

Bien, entonces esto es un poco confuso (bueno para mí). Tengo una cadena que tiene un número único que quiero sacar. He rodeado este número con '/', así podré obtener ese número más tarde.¿Subcadena con rango fuera de límites?

Así es como estoy recibiendo el número de ella:

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 cae y la consola dice:

* Terminación de aplicación debido a excepción no detectada 'NSRangeException', razón : '- [__ NSCFString substringWithRange:]: Rango o índice fuera de límites' pila de llamadas * primer tiro: (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: Terminar llamada lanzar una excepción

Desde mi contar el rango está dentro de los límites, no me llevo por qué estoy recibiendo este error?

Cualquier ayuda sería apreciada.

Gracias

+0

es probable que alguien más responda su pregunta bastante rápido, pero una cosa que quería señalar es a.s.a.p. era * nunca * usar todas las mayúsculas (o mayúscula) el nombre de una variable, como "' MYSTRING' ". Todas las mayúsculas y minúsculas pueden ser apropiadas para Constantes, pero otro estilo preferido es el prefijo de un Konstant con una K (o minúscula k). –

+0

Oh, solo lo hice, así que es notable para ustedes :), no es así en el código – Jacob

Respuesta

24

Su NSMakeRange (inicio, final) debe ser NSMakeRange (inicio, fin-inicio);

+0

¡¡Funcionó !! Gracias – Jacob

2

no sé qué su están utilizando este método, pero IOS proporciona una función de cadena que separa una cadena con respecto a otra cadena y devuelve una matriz de los componentes. Consulte el siguiente ejemplo:

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

Ahora su cadena de componentes debe tener 2 almacenes en ella.

+0

Nunca supe que existiera tal función, ¿Podrían proporcionar un poco de código relativo a mi ejemplo para ayudarme a entender exactamente cómo esa funcion funciona? Gracias por la respuesta – Jacob

1

Cuando el compilador se encuentra con el código ...

else{ 
    end = i + 1; 
} 

... en la última iteración del bucle, se establece la variable de extremo a uno más entonces el rango de MYSTRING. Es por eso que estás obteniendo ese error. Para solucionarlo, simplemente haga esto:

else{ 
    end = i; 
} 

Espero que ayude!

P.S. El enfoque de Saleh es una manera más sencilla de lograr lo que quiere

------ ------ ACTUALIZACIÓN

Usted debe hacerlo de esta realidad:

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

todavía error al hacer eso:/ – Jacob

6

Creo que tiene confusión en la sintaxis de NSMakeRange. Es algo como esto

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

<#NSUInteger loc#>: es la ubicación desde donde desea empezar a recoger o subcadena.

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

Ejemplo:

Mytest12test

Ahora quiero pick'12'

manera:

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

En su código en lugar de longitud está de paso Índice de carácter de fin ese es tu error

+0

Oh, eso tiene más sentido – Jacob

+0

NSMakeRange (<# NSUInteger loC#>, <#NSUInteger len #>) Esto dejó mucho en claro – Jasmeet

Cuestiones relacionadas