2012-04-25 76 views
8

我试图循环遍历一个字符的NSString字符,但我得到一个EXC_BAD_ACCESS错误。你有一个想法如何做到这一点?我一直在Google上搜索几个小时,但无法弄清楚。Objective-C NSString用于循环的characterAtIndex

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

非常感谢!

+1

你只是试图找到一个字符串中的特定字符的位置?如果是的话,有一个更简单的解决方案 – Lefteris 2012-04-25 12:22:24

回答

28

字符不反对。 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的。它们都是不同的类型。

当您使用%@NSLog单字符ch,它正试图从打印内存位置ch这是无效的对象。因此你得到一个EXC_BAD_ACCESS。

+0

非常感谢您的解答,以及很好的解释! – Linus 2012-04-25 14:13:49

+0

太好了,谢谢!我正在使用'[NSString stringWithFormat:@“%hu”'这也导致了一个错误。 – Patrick 2012-12-19 11:17:02

0

characterAtIndex:返回unichar,这是因为typedef unsigned short unichar;格式说明你正在使用您的通话NSLog声明是不正确的,你可以只是做NSLog(@"%u",[self.text characterAtIndex:position]);NSLog(@"%C",[self.text characterAtIndex:position]);如果你想实际的字符打印出来。

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

​​
+0

非常感谢您的回答! – Linus 2012-04-25 14:14:43

0

如果你想找到一个字符的字符串中的位置,您可以使用此:

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

如果字符或文本没有找到,你会得到一个NSNotFound:

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

非常感谢您的回答! – Linus 2012-04-25 14:14:26