2012-06-21 16 views
7

Ok, quindi questo è un po 'confuso (beh, per me). Ho una stringa che ha un singolo numero che voglio fuori. Ho circondato questo numero con "/" in modo da essere in grado di ottenere quel numero in seguito.Sottostringa con intervallo fuori limite?

Ecco come io sono sempre il numero fuori di esso:

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

si blocca di continuo e la console dice:

* Chiusura di applicazione a causa di eccezione non identificata 'NSRangeException', la ragione : '- [__NSCFString substringWithRange:]: intervallo o indice fuori limite' * Primo stack di chiamate throw: (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: Termina chiamata un'eccezione

Dal mio conteggio del range è all'interno dei limiti, io non capisco perché io sto ottenendo questo errore?

Qualsiasi aiuto sarebbe apprezzato.

Grazie

+0

qualcun altro probabilmente risponderà alla tua domanda abbastanza rapidamente, ma una cosa volevo sottolineare a.s.a.p. era * mai * usare maiuscole (o maiuscole) il nome di una variabile, come "' MYSTRING' ". Tutte le maiuscole potrebbero essere appropriate per le costanti, ma un altro stile preferito è prefissare un Konstant con una K (o una minuscola k). –

+0

Oh l'ho fatto solo così è evidente per voi ragazzi :), non è così nel codice – Jacob

risposta

24

tuo NSMakeRange (inizio, fine) dovrebbe essere NSMakeRange (start, end-start);

+0

Ha funzionato !! Grazie – Jacob

2

non so il motivo per cui si sta usando questo approccio, ma iOS fornisce una funzione di stringa che separa una stringa rispetto ad un'altra stringa e restituisce un array di componenti. Vedere il seguente esempio:

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

Ora la stringa di componenti deve contenere 2 negozi.

+0

Non ho mai saputo che esistesse una funzione del genere, potreste possibilmente fornire un po 'di codice relativo al mio esempio per aiutarmi a capire esattamente come quella funzione funziona? Grazie per la risposta – Jacob

1

Quando il compilatore incontra questo codice ...

else{ 
    end = i + 1; 
} 

... nell'ultima iterazione del ciclo, si imposta la variabile estremità a una più allora la gamma di MYSTRING. Questo è il motivo per cui ricevi questo errore. Per risolvere il problema, basta fare ciò:

else{ 
    end = i; 
} 

Spero che questo aiuti!

P.S. L'approccio di Saleh è un modo più semplice di realizzare ciò che si vuole

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

si dovrebbe fare in questo modo in realtà:

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

ho ancora errore nel farlo:/ – Jacob

6

Penso che tu abbia confusione nella sintassi di NSMakeRange. E 'qualcosa di simile

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

<#NSUInteger loc#>: E' il luogo da cui si desidera iniziare la raccolta o stringa.

<#NSUInteger len#>: Questa è la lunghezza dell'output o della sottostringa.

Esempio:

Mytest12test

Ora voglio pick'12'

così:

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

Nel codice, invece di lunghezza si passa indice del carattere di fine questo è un tuo errore

+0

Oh che ha più senso – Jacob

+0

NSMakeRange (<# NSUInteger loC#>, <#NSUInteger len #>) questo ha reso molto chiaro – Jasmeet

Problemi correlati