8

I'm trying to loop through a NSString, character by character, but I'm getting a EXC_BAD_ACCESS error. Do you have an idea how to do this right? I've been googling for hours now but can't figure it out.

Here is my code (.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!

Linus
  • 4,643
  • 8
  • 49
  • 74
  • 1
    Are you just trying to find the position of a particular character in a string? If yes, there's an easier solution – Lefteris Apr 25 '12 at 12:22

4 Answers4

30

Characters are not object. characterAtIndex returns unichar, which is actually an integer type unsigned short. You need to use %C instead of %@ in NSLog. Also character is not a NSString, so you can't send it isEqualToString. You need to use ch == '.' to compare ch against '.'.

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

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

Note that, 'a' is character, "a" is C string and @"a" is NSString. They all are different types.

When you are using %@ with unichar ch in NSLog, it is trying to print an object from memory location ch which is invalid. Thus you are getting a EXC_BAD_ACCESS.

5lava
  • 1,168
  • 11
  • 12
taskinoor
  • 45,586
  • 12
  • 116
  • 142
4

characterAtIndex: returns a unichar, so you should use NSLog(@"%C", ...) instead of @"%@".

You also cannot use isEqualToString for a unichar, just use == '.' is fine.

If you want to find the position of all '.'s, you can use rangeOfString. Refer to:

Community
  • 1
  • 1
Hailei
  • 42,163
  • 6
  • 44
  • 69
0

characterAtIndex: returns a unichar, which is declared as typedef unsigned short unichar; The format specifier you are using in your calls to NSLog are incorrect, you could just do NSLog(@"%u",[self.text characterAtIndex:position]); or NSLog(@"%C",[self.text characterAtIndex:position]); if you want the actual character to print out.

Also, as a result of unichar being defined the way that it is, it's not a string, so you cannot compare it to other strings. Try something like:

unichar textCharacter = '.';

if ([self.text characterAtPosition:position] == testCharacter) {
   // do stuff
}
willbur1984
  • 1,418
  • 1
  • 12
  • 21
0

If you want to find the location of a character in a string you can use this:

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

if the character or text is not found you will get a NSNotFound:

if(position==NSNotFound)
    NSLog(@"text not found!");
Lefteris
  • 14,550
  • 2
  • 56
  • 95