8

我正在尝试逐个字符地循环遍历 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

4 回答 4

30

字符不是对象。characterAtIndex返回unichar,它实际上是一个整数类型unsigned short。您需要使用%C而不是%@in NSLog。另外 character 不是 a 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。它们都是不同的类型。

当您使用%@with unichar chin 时NSLog,它会尝试从ch无效的内存位置打印对象。因此你得到一个 EXC_BAD_ACCESS。

于 2012-04-25T12:23:29.613 回答
4

characterAtIndex:返回 a unichar,因此您应该使用NSLog(@"%C", ...)而不是@"%@".

您也不能isEqualToString用于 a unichar,只需使用即可== '.'

如果要查找所有 '.' 的位置,可以使用rangeOfString. 参考:

于 2012-04-25T12:22:54.187 回答
0

characterAtIndex:返回 a unichar,它被声明为typedef unsigned short unichar;您在调用中使用的格式说明符NSLog不正确,您可以这样做,NSLog(@"%u",[self.text characterAtIndex:position]);或者NSLog(@"%C",[self.text characterAtIndex:position]);如果您希望打印出实际字符。

此外,由于 unichar 是按原样定义的,它不是字符串,因此您无法将其与其他字符串进行比较。尝试类似:

unichar textCharacter = '.';

if ([self.text characterAtPosition:position] == testCharacter) {
   // do stuff
}
于 2012-04-25T12:27:15.683 回答
0

如果要查找字符串中字符的位置,可以使用以下命令:

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

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

if(position==NSNotFound)
    NSLog(@"text not found!");
于 2012-04-25T12:28:44.920 回答