我正在尝试逐个字符地循环遍历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 .");
}
}
非常感谢!
答案 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!");