Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C NSString for loop with characterAtIndex

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!

like image 658
Linus Avatar asked Apr 25 '12 12:04

Linus


2 Answers

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.

like image 85
taskinoor Avatar answered Sep 17 '22 03:09

taskinoor


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:

  • String Programming Guide: Searching, Comparing, and Sorting Strings
  • Position of a character in a NSString or NSMutableString
like image 32
Hailei Avatar answered Sep 17 '22 03:09

Hailei