isEqualToString не возвращает true

Оператор «Остановка» никогда не печатается, даже если вы набираете «стоп» при запуске программы. Вводит ли метод 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;
}

person Ali    schedule 17.05.2011    source источник
comment
NSLog находится за пределами if, поэтому он все равно печатается. Он отображает текст, который я ввел правильно.   -  person Ali    schedule 17.05.2011


Ответы (3)


Код выглядит нормально, хотя вы пропускаете строку words. Вам нужно добавить [autorelease] в конце этого вызова alloc.

Вы можете попробовать initWithCString, а также обрезать новые строки и окружающие пробелы.

NSString *words = [[[NSString alloc] initWithCString:holderText] autorelease];
words = [words stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
person Nick Bedford    schedule 17.05.2011
comment
Использование сборки мусора, поэтому не требуется автовыпуск. Но спасибо. - person Ali; 17.05.2011
comment
Ах. Ну, я полагаю, это применимо к iOS: P - person Nick Bedford; 17.05.2011

fgets будет включать конечную новую строку в строку, которую он вам дает (за исключением случая, когда он не помещается в буфер, но здесь это не так), поэтому это будет "stop\n", а не "stop".

Изменение строки журнала на:

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

должны, надеюсь, прояснить, что происходит.

Либо измените сравнение, чтобы принять это во внимание, либо обрежьте новую строку перед сравнением.

person paxdiablo    schedule 17.05.2011
comment
ах! поэтому мне нужно вручную удалить \n в конце или использовать scanf? Есть ли лучший способ получить ввод со стандартного ввода и поместить его в NSString? - person Ali; 17.05.2011
comment
scanf (по крайней мере, неограниченный вариант "%s") всегда является плохой идеей для пользовательского ввода (f предназначен для форматированного, а есть драгоценный менее форматированный, чем пользовательский ввод). Вы можете либо обрезать, либо просто изменить сравнение, включив новую строку - последний, вероятно, самый быстрый/самый простой, хотя некоторые пуристы будут настаивать на том, что это выглядит уродливо :-) - person paxdiablo; 17.05.2011

Поскольку fgets, вероятно, будет включать завершающую новую строку, вы можете захотеть обрезать все символы новой строки в строке, используя stringByTrimmingCharactersInSet::

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

if([trimmed isEqualToString:@"stop"]]) {
  //...
}
person Jacob Relkin    schedule 17.05.2011