代码之家  ›  专栏  ›  技术社区  ›  bmeulmeester

奇怪的可可虫?

  •  1
  • bmeulmeester  · 技术社区  · 14 年前

    嘿,伙计们,下面是我在学校作业时用的一段代码。 每当我输入一个单词,其中有一个O(大写O),它就会失败! 每当程序中有一个或多个大写的O时,它将返回false和logs:sentence而不是回文。

    回文,对于那些不知道回文是什么的人来说,是一个从左到右和从后读都一样的词。(例如LOL、皮艇、救生艇等) 我在检查有史以来最古老的回文时发现了这个错误:萨托·阿雷波·特内特歌剧罗塔。

    当我把所有的大写字母O都改成小写字母O时,它会起作用,并返回true。 让我用这段代码清楚地说明,所有的句子/单词都用大写字母“o”返回“false”。一个大写字母O就足以使这个计划失败。

    -(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]; 
    }
    

    那么,这是可可中的一种奇怪的虫子吗? 还是我错过了什么?

    2 回复  |  直到 14 年前
        1
  •  4
  •   ynnckcmprnl    14 年前

    当然,这不是可可里的虫子,你可能在内心深处就知道了。

    您的比较方法导致了这个“cocoa中的bug”,您正在比较charone和chartwo的地址。相反,您应该将字符串的内容与ISequalToString消息进行比较。

    用途:

    if(![charOne isEqualToString:charTwo]) {
    

    而不是:

    if(charOne != charTwo) {
    

    编辑:在一个测试项目中测试它,可以确认这是问题所在。

        2
  •  3
  •   Stephen Furlani    14 年前

    不要使用 charOne != charTwo

    而是使用 NSString Compare Methods.

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

    这也可能与 localization (but I doubt it).