8

NSString を 1 文字ずつループしようとしていますが、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です。in%Cの代わりに使用する必要があります。また、キャラクターは ではないので送信できません。と比較するには を使用する必要があります。%@NSLogNSStringisEqualToStringch == '.'ch'.'

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

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

'a'は文字で"a"あり、C 文字列であり、@"a"NSStringであることに注意してください。それらはすべて異なるタイプです。

%@で unichar を使用してchいる場合、無効なNSLogメモリ位置からオブジェクトを印刷しようとしてchいます。したがって、EXC_BAD_ACCESS を取得しています。

于 2012-04-25T12:23:29.613 に答える
4

characterAtIndex:は を返すので、代わりに をunichar使用する必要があります。NSLog(@"%C", ...)@"%@"

にも使用できません。使用するisEqualToStringだけunichar== '.'問題ありません。

すべての '.' の位置を見つけたい場合は、. を使用できますrangeOfString。参照する:

于 2012-04-25T12:22:54.187 に答える
0

characterAtIndex:unicharとして宣言されているを返しtypedef unsigned short unichar;ますNSLogNSLog(@"%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 に答える