1

皆さん、下は私が学校の課題に使用したコードの一部です。O(大文字のo)を含む単語を入力すると、失敗します。このプログラムに1つ以上の大文字のOがある場合は常に、falseを返し、ログに記録します。文は回文ではありません。

回文は、回文が何であるかを知らない人々にとって、右から左、そして後ろに同じように読まれる単語です。(例:笑、カヤック、リバイバーなど)これまでに見つかった「最も古い」回文をチェックしようとしたときにこのバグを見つけました:SATOR AREPO TENETOPERAROTAS。

すべて大文字のoを小文字のoに変更すると、機能し、trueを返します。このコードでは、大文字のOが付いたすべての文/単語がfalseを返します。このプログラムを失敗させるには、大文字の1つで十分です。

-(BOOL)testForPalindrome:(NSString *)s position:(NSInteger)pos {
    NSString *string = s;
    NSInteger position = pos;
    NSInteger stringLength = [string length];
    NSString *charOne = [string substringFromIndex:position];
    charOne = [charOne substringToIndex:1];

    NSString *charTwo = [string substringFromIndex:(stringLength - 1 - position)];
    charTwo = [charTwo substringToIndex:1];
    if(position > (stringLength / 2)) {
        NSString *printableString = [NSString stringWithFormat:@"De following word or sentence is a palindrome: \n\n%@", string];
        NSLog(@"%@ is a palindrome.", string);
        [textField setStringValue:printableString];
        return YES;
    }
    if(charOne != charTwo) {
        NSLog(@"%@, %@", charOne, charTwo);
        NSLog(@"%i", position);
        NSLog(@"%@ is not a palindrome.", string);
        return NO;
    }
    return [self testForPalindrome:string position:position+1]; 
}

それで、これはココアの奇妙なバグですか?それとも私は何かが足りないのですか?

  • B
4

2 に答える 2

4

もちろん、これはCocoaのバグではありません。おそらく、内部の奥深くで知っているでしょう。

あなたのcompareメソッドがこの「Cocoaのバグ」を引き起こしています。charOneとcharTwoのアドレスを比較しています。代わりに、文字列の内容をisEqualToStringメッセージと比較する必要があります。

使用する:

if(![charOne isEqualToString:charTwo]) {

それ以外の:

if(charOne != charTwo) {

編集:テストプロジェクトでテストし、これが問題であることを確認できます。

于 2010-09-27T13:45:01.130 に答える
3

使用しないでくださいcharOne != charTwo

代わりに、NSStringCompareメソッドの1つを使用してください。

if ([charOne caseInsensitiveCompare:charTwo] != NSOrderedSame)

ローカリゼーションにも関係している可能性があります(しかし、私はそれを疑っています)。

于 2010-09-27T13:47:05.337 に答える