Objective-C NSString for character with characterAtIndex

时间:2012-04-25 12:17:44

标签: objective-c xcode loops for-loop

我正在尝试逐个字符地循环遍历NSString,但是我收到了EXC_BAD_ACCESS错误。你知道如何做到这一点吗?我现在一直在谷歌搜索几个小时,但无法理解。

这是我的代码(.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 .");
    }
}

非常感谢!

4 个答案:

答案 0 :(得分:29)

字符不是对象。 characterAtIndex返回unichar,实际上是整数类型unsigned short。您需要在%C中使用%@代替NSLog。此外,字符不是NSString,因此您无法发送isEqualToString。您需要使用ch == '.'ch'.'进行比较。

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

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

请注意,'a'是字符,"a"是C字符串,@"a"是NSString。它们都是不同的类型。

当您在%@中使用ch与unichar NSLog时,它正在尝试从内存位置ch打印无效的对象。因此,您获得了EXC_BAD_ACCESS。

答案 1 :(得分:4)

characterAtIndex:会返回unichar,因此您应使用NSLog(@"%C", ...)代替@"%@"

您也无法将isEqualToString用于unichar,只需使用== '.'即可。

如果你想找到所有'。'的位置,你可以使用rangeOfString。请参阅:

答案 2 :(得分:0)

characterAtIndex:返回unichar,声明为typedef unsigned short unichar;您在调用NSLog时使用的格式说明符不正确,您可以{{1}如果你想要打印出实际的字符,可以使用NSLog(@"%u",[self.text characterAtIndex:position]);

此外,由于unichar被定义为它的方式,它不是一个字符串,所以你不能将它与其他字符串进行比较。尝试类似:

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

答案 3 :(得分:0)

如果要在字符串中找到字符的位置,可以使用:

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

如果找不到字符或文本,您将获得NSNotFound:

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