2012-04-25 15 views
8

Próbuję przechodzić przez NSString, znak po znaku, ale otrzymuję błąd EXC_BAD_ACCESS. Czy masz pomysł, jak to zrobić dobrze? Odwiedzam go od wielu godzin, ale nie mogę tego rozgryźć.Objective-C NSString dla pętli z characterAtIndex

Oto mój kod (.m):

self.textLength = [self.text length]; 

for (int position=0; position < self.textLength; position++) { 

    NSLog(@"%@", [self.text characterAtIndex:position]); 

    if ([[self.text characterAtIndex:position] isEqualToString:@"."]){ 
     NSLog(@"it's a ."); 
    } 
} 

Thanks a lot!

+1

Próbujesz znaleźć pozycję konkretnej postaci w ciągu znaków? Jeśli tak, jest łatwiejsze rozwiązanie – Lefteris

Odpowiedz

28

Postacie nie są sprzeciwu. characterAtIndex zwraca unichar, która jest faktycznie liczbą całkowitą typu unsigned short. Musisz użyć %C zamiast %@ w NSLog. Również postać nie jest NSString, więc nie możesz jej wysłać isEqualToString. Musisz użyć ch == '.', aby porównać ch z '.'.

unichar ch = [self.text characterAtIndex:position]; 
NSLog(@"%C", ch); 

if (ch == '.') {} // single quotes around dot, not double quotes 

zauważyć, że 'a' to znak, "a" jest ciąg C i @"a" jest NSString. Wszystkie są różne.

Kiedy używasz %@ z unichar ch w NSLog, to próbuje drukować obiekt z lokalizacji pamięci ch który jest nieprawidłowy. W ten sposób otrzymujesz EXC_BAD_ACCESS.

+0

Dziękuję bardzo za rozwiązanie, a także świetne wyjaśnienie! – Linus

+0

Świetnie, dzięki! Użyłem '[NSString stringWithFormat: @"% hu "', który również spowodował błąd. – Patrick

0

characterAtIndex: zwraca unichar, który jest zadeklarowany jako typedef unsigned short unichar; Format specyfikującego używasz w swoich połączeń do NSLog są niepoprawne, można po prostu zrobić NSLog(@"%u",[self.text characterAtIndex:position]); lub NSLog(@"%C",[self.text characterAtIndex:position]); jeśli chcesz rzeczywisty charakter wydrukować.

Ponadto, w wyniku zdefiniowania unichar w taki sposób, w jaki jest, nie jest ciągiem znaków, więc nie można go porównać z innymi ciągami. Spróbuj czegoś takiego:

unichar textCharacter = '.'; 

if ([self.text characterAtPosition:position] == testCharacter) { 
    // do stuff 
} 
+0

Wielkie dzięki za odpowiedź! – Linus

0

Jeśli chcesz znaleźć lokalizację znaku w ciągu znaków można użyć tego:

NSUInteger position = [text rangeOfString:@"."].location; 

jeśli znak lub tekst nie zostanie znaleziony dostaniesz NSNotFound:

if(position==NSNotFound) 
    NSLog(@"text not found!"); 
+0

Wielkie dzięki za odpowiedź! – Linus