Objective c isEqualToString未返回true

Objective c isEqualToString未返回true,objective-c,cocoa,nsstring,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 *

即使在运行程序时键入“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;
}
fgets将在它提供给您的字符串中包含尾随的换行符,除非它不适合缓冲区,但这里不是这样,因此它将是stop\n而不是stop

将日志行更改为:

NSLog(@"This is what you typed: [%@]", words);
希望你能弄清楚发生了什么

修改比较以考虑到这一点,或者在比较之前修剪换行符。

由于FGET可能会包含一个尾随换行符,因此您可能希望使用StringByTrimmingCharactersSet:修剪字符串中的所有换行符:


代码看起来很好,即使您正在泄漏单词字符串。您需要在alloc调用的末尾添加一个[autorelease]

您可以尝试initWithCString,也可以修剪新行和周围的空白

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

NSLog在if之外,因此无论如何都会打印出来。它正确地显示了我输入的文本。啊!所以我必须在最后手动删除\n还是使用scanf?是否有更好的方法从stdin获取输入并将其放入NSString?scanf至少无界的%s变量对于用户输入来说总是一个坏主意f用于格式化,而且格式比用户输入少。您可以修剪或只是更改比较以包含换行符-后者可能是最快/最简单的,尽管一些纯粹主义者会坚持认为它看起来很难看:-使用垃圾收集,因此不需要自动释放。但是谢谢。我想这也适用于iOS:P
NSString *words = [[[NSString alloc] initWithCString:holderText] autorelease];
words = [words stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];