2012-04-25 18 views
8

NSStringを文字単位でループしようとしていますが、EXC_BAD_ACCESSエラーが発生しています。あなたはこれを正しく行う方法を知っていますか?私は今何時間もグーグルで行ってきましたが、それを理解することはできません。Objective-C characterAtIndexを使ったNSString forループ

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 ."); 
    } 
} 

どうもありがとう:

は、ここに私のコード(.M)です!

+1

文字列内の特定の文字の位置を確認しようとしていますか?はいの場合、簡単な解決策があります – Lefteris

答えて

28

:を参照してください。 characterAtIndexunicharを返します。これは実際には整数型のunsigned shortです。 NSLog%@の代わりに%Cを使用する必要があります。また、文字はNSStringではないので、isEqualToStringを送信することはできません。 と'.'を比較するには、ch == '.'を使用する必要があります。 'a'が文字で、

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

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

注、"a"はC文字列であると@"a"はNSStringのです。それらはすべて異なるタイプです。あなたはNSLog内のunichar ch%@を使用している場合は

、無効であるメモリ位置chからオブジェクトを印刷しようとしています。したがって、あなたはEXC_BAD_ACCESSを取得しています。

+0

解決には大変感謝しています。 – Linus

+0

すばらしい、ありがとう!私も '[NSString stringWithFormat:@"%hu "'を使ってエラーを引き起こしました。 – Patrick

4

characterAtIndex:unicharを返すので、@"%@"の代わりにNSLog(@"%C", ...)を使用してください。

unicharにはisEqualToStringを使用できません。ちょうど== '.'を使用してください。

すべての '。'の位置を検索する場合は、rangeOfStringを使用できます。文字が対象でない

+0

お返事ありがとうございます! – Linus

0

characterAtIndex:は、あなたが実際の文字をプリントアウトしたい場合は、単にNSLog(@"%u",[self.text characterAtIndex:position]);またはNSLog(@"%C",[self.text characterAtIndex:position]);を行うことができ、あなたがNSLogにあなたの呼び出しで使用しているtypedef unsigned short unichar;書式指定子として宣言間違ってされunicharを返します。

また、unicharが定義されているため、文字列ではないため、他の文字列と比較することはできません。文字またはテキストはあなたがNSNotFound取得しますが見つからない場合

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

:あなたはこれを使用することができ、文字列内の文字の位置を検索したい場合は

​​
+0

お返事ありがとうございました! – Linus

0

:のようなものを試してみてください:

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

お返事ありがとうございました! – Linus

関連する問題