2012-06-21 18 views
7

Okay, also das ist ein bisschen verwirrend (gut zu mir). Ich habe eine Zeichenfolge, die eine einzige Nummer hat, die ich daraus haben möchte. Ich habe diese Nummer mit '/' umgeben, damit ich später die Nummer herausholen kann.Teilstring mit Bereich außerhalb der Grenzen?

Hier ist, wie ich die Nummer aus ihm bin immer:

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

Es stürzt immer wieder ab und die Konsole sagt:

* Beenden app aufgrund nicht abgefangene Ausnahme ‚NSRangeException‘, Grund : '- [__ NSCFString substringWithRange:]: Bereich oder Index außerhalb der Grenzen' * ersten Wurf 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:

eine Ausnahme genannt terminate werfen Von meinem den Bereich zu zählen ist innerhalb der Grenzen, bekomme ich nicht, warum ich bekomme ich diesen Fehler?

Jede Hilfe wäre willkommen.

Dank

+0

jemand anders wird wahrscheinlich Ihre Frage ziemlich schnell beantworten, aber eine Sache wollte ich darauf hinweisen, a.s.a.p. sollte * niemals * alle Großbuchstaben (oder Großbuchstaben) des Namens einer Variablen verwenden, wie "MYSTRING". Alle Großbuchstaben könnten für Konstanten geeignet sein, aber ein anderer bevorzugter Stil besteht darin, Konstant mit einem K (oder Kleinbuchstaben k) voranzutreiben. –

+0

Oh ich habe es nur so gemacht, dass es für euch wahrnehmbar ist :), es ist nicht so in Code – Jacob

Antwort

24

Ihre NSMakeRange (start, end) sollte NSMakeRange (start, end-start) sein;

+0

Arbeitete !! Danke – Jacob

2

Ich weiß nicht, warum Ihr diesen Ansatz verwenden, aber iOS bietet eine String-Funktion, die eine Zeichenfolge in Bezug auf einen anderen String trennt und gibt ein Array der Komponenten. Siehe das folgende Beispiel:

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

Jetzt sollte Ihre Komponente Zeichenfolge 2 Speicher darin haben.

+0

Ich wusste nie, dass es eine solche Funktion gab. Könntest du vielleicht ein bisschen Code relativ zu meinem Beispiel liefern, um mir zu helfen, genau zu verstehen wie Diese Funktion funktioniert? Danke für die Antwort – Jacob

1

Wenn der Compiler läuft in diesem Code ...

else{ 
    end = i + 1; 
} 

... in der letzten Iteration der Schleife, setzt er das Ende variable einem mehr dann der Bereich von MYSTRING. Deshalb erhalten Sie diesen Fehler. Um es zu beheben, tun Sie das einfach:

else{ 
    end = i; 
} 

Hoffe, das hilft!

P.S. Saleh Ansatz ist eine einfachere Art und Weise zu bewerkstelligen, was Sie

------ ------ aktualisierenden

Sie es wie diese eigentlich tun sollten:

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

ich immer noch Fehler dabei:/ – Jacob

6

Ich denke, Sie haben Verwirrung in der Syntax von NSMakeRange. Es ist so etwas wie dies

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

<#NSUInteger loc#>: Es ist der Ort, von wo aus Sie Kommissionierung oder Teilkette zu starten.

<#NSUInteger len#>: Dies ist die Länge Ihrer Ausgabe oder Teilzeichenfolge.

Beispiel:

Mytest12test

Jetzt möchte ich pick'12'

so:

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

In Ihrem Code statt Länge sind vorbei Sie Index Endezeichen das ist dein Fehler.

+0

Oh das macht mehr Sinn – Jacob

+0

NSMakeRange (<# NSUInteger loC#>, <#NSUInteger len #>) das machte viel klar – Jasmeet

Verwandte Themen