isEqualToString未返回true

时间:2011-05-17 02:40:21

标签: objective-c cocoa nsstring

即使在运行程序时键入“stop”,也不会打印“Stopping”语句。 initWithUTF8String:方法是否引入了额外的格式?

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    char holderText[256];

    fgets(holderText, 256, stdin);
    NSString *words = [[NSString alloc] initWithUTF8String:holderText];


    if ([words isEqualToString:@"stop"]) {

        NSLog(@"STOPPING");

    }
    NSLog(@"This is what you typed: %@", words);

    [pool drain];
    return 0;
}

3 个答案:

答案 0 :(得分:6)

fgets将在它给你的字符串中包含尾部换行符(除非它不适合缓冲区,但在这里不是这样),所以它将是"stop\n"而是比"stop"

将日志行更改为:

NSLog(@"This is what you typed: [%@]", words);

应该有希望明确发生了什么。

修改比较以将此考虑在内,或在比较前修剪换行符。

答案 1 :(得分:3)

由于fgets可能包含尾随换行符,您可能希望使用stringByTrimmingCharactersInSet:修改字符串中的所有换行符:

NSString *trimmed = [words stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

if([trimmed isEqualToString:@"stop"]]) {
  //...
}

答案 2 :(得分:2)

即使您泄漏了words字符串,代码看起来还不错。您需要在该alloc调用的末尾添加[autorelease]

您可以尝试initWithCString并修剪新行和周围的空格。

NSString *words = [[[NSString alloc] initWithCString:holderText] autorelease];
words = [words stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];