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
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:
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
}
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!");
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.