Битва с NSScannner

24 views
Skip to first unread message

antons

unread,
Apr 5, 2009, 2:01:05 PM4/5/09
to sellme-dev
Привет!

Я пытаюсь заставить NSScanner просканировать мне строку на наличие в
ней какого-то символа и вернуть BOOL, чтобы я на основании этого уже
что-то еще делал. Но почему-то NSScanner постоянно возвращает мне
"NO". :-( Проверял документацию, кажется все правильно. Но, видимо,
только кажется, раз не работает. Вот код:

NSString *myString = @"hello.";
NSScanner *sentenceSeparatorScanner = [NSScanner
scannerWithString:myString];
NSCharacterSet *separatorsCharacterSet = [NSCharacterSet
characterSetWithCharactersInString:@"."];
[sentenceSeparatorScanner setCharactersToBeSkipped:nil];
if ([sentenceSeparatorScanner
scanCharactersFromSet:separatorsCharacterSet intoString:NULL] == TRUE)
NSLog(@"TRUE");
else
NSLog(@"FALSE");

Подскажите, пожалуйста, что тут неправильно?

Антон.

Dmitry Chestnykh

unread,
Apr 5, 2009, 2:59:36 PM4/5/09
to sellm...@googlegroups.com
scanCharactersFromSet:intoString:
Scans the string *as long as* characters from a given character set
are encountered, accumulating characters into a string that’s
returned by reference.

Получается, ты сканируешь строку, пока
в ней есть ".". То есть для твоего случая
надо NSCharacterSet со всеми символами, кроме
"." :-)

Для твоего случая подойдет

[myString rangeOfCharactersFromSet:separatorsCharacterSet].location !=
NSNotFound;

— Dmitry Chestnykh.

Dmitry Chestnykh

unread,
Apr 5, 2009, 3:03:10 PM4/5/09
to sellme-dev
Да, кстати в ObjC YES/NO используют, а не TRUE/FALSE ;)

Dmitry Chestnykh

unread,
Apr 5, 2009, 3:05:13 PM4/5/09
to sellme-dev
>Получается, ты сканируешь строку, пока
>в ней есть ".". То есть для твоего случая
>надо NSCharacterSet со всеми символами, кроме
>"." :-)

Поправка: и так cо scanCharactersFromSet:intoString: неправильно
получится:
YES if the receiver scanned any characters, otherwise NO.

Игорь Евсюков

unread,
Apr 5, 2009, 3:06:57 PM4/5/09
to sellm...@googlegroups.com
может быть так:
> if ([sentenceSeparatorScanner
> scanCharactersFromSet:separatorsCharacterSet intoString:NULL] == YES)
> NSLog(@"YES");
> else
> NSLog(@"NO");

Dmitry Chestnykh

unread,
Apr 5, 2009, 4:18:23 PM4/5/09
to sellme-dev
> может быть так:

Хе-хе, нет:

CFBase.h:

#if !defined(TRUE)
#define TRUE 1
#endif

#if !defined(FALSE)
#define FALSE 0
#endif


objc.h:

#define YES (BOOL)1
#define NO (BOOL)0


Так что, фактически разницы нет, хоть и принято YES/NO использовать.

Да, и еще.

ЕСЛИ (Я ПРОВЕРЯЮ УСЛОВИЕ С ПОМОЩЬЮ СРАВНЕНИЯ С YES ИЛИ NO == Я
ПРОВЕРЯЮ УСЛОВИЕ С ПОМОЩЬЮ СРАВНЕНИЯ С YES ИЛИ NO) ТО
Я ЧТО-ТО ДЕЛАЮ НЕ ТАК


-ДЧ

antons

unread,
Apr 7, 2009, 3:44:53 PM4/7/09
to sellme-dev
Спасибо за совет, я и стал использовать [myString
rangeOfCharacterFromSet:separatorsCharacterSet].location !=
NSNotFound;

Только у тебя там опечатка: не rangeOfCharactersFromSet:, а
rangeOfCharacterFromSet: :)

Приму на заметку, что принято использовать YES и NO.

Тем временем у меня еще один вопрос появился. Вот такой код работает:
unichar letter = [itemToScanMutableString characterAtIndex:0];
[itemToScanMutableString replaceCharactersInRange:NSMakeRange(0, 1)
withString:[[NSString stringWithCharacters:&letter length:1]
uppercaseString]];

А его небольшая модификация (для убирания ненужной тут переменной
letter) выдает ошибку компилятора "warning: passing argument 1 of
'stringWithCharacters:length:' makes pointer from integer without a
cast":
[itemToScanMutableString replaceCharactersInRange:NSMakeRange(0, 1)
withString:[[NSString stringWithCharacters:[itemToScanMutableString
characterAtIndex:0] length:1] uppercaseString]];

Как сделать текст в квадратных скобках поинтером? :/ Или так сделать
нельзя? :(

Dmitry Chestnykh

unread,
Apr 7, 2009, 5:17:20 PM4/7/09
to sellm...@googlegroups.com
> Тем временем у меня еще один вопрос
> появился. Вот такой код работает:
> unichar letter = [itemToScanMutableString characterAtIndex:0];
> [itemToScanMutableString replaceCharactersInRange:NSMakeRange(0, 1)
> withString:[[NSString stringWithCharacters:&letter length:1]
> uppercaseString]];
>
> А его небольшая модификация (для
> убирания ненужной тут переменной
> letter) выдает ошибку компилятора "warning:
> passing argument 1 of
> 'stringWithCharacters:length:' makes pointer from integer without a
> cast":
> [itemToScanMutableString replaceCharactersInRange:NSMakeRange(0, 1)
> withString:[[NSString stringWithCharacters:[itemToScanMutableString
> characterAtIndex:0] length:1] uppercaseString]];
>
> Как сделать текст в квадратных
> скобках поинтером? :/ Или так сделать
> нельзя? :(

Так сделать нельзя, оператор & требует
lvalue

(хрень, которую можно поставить в левую
часть присвоения, типа:
letter = 100; // lvalue
[itemToScanMutableString characterAtIndex:0] = 100; // не катит )

Так что оставь переменную -- да и
читабельнее так будет.


— Dmitry Chestnykh.

antons

unread,
Apr 12, 2009, 10:35:21 PM4/12/09
to sellme-dev
Заменил все же это одной строкой, использовав substringWithRange: :-)

[temporaryMutableString replaceCharactersInRange:NSMakeRange(0, 1)
withString:[[temporaryMutableString substringWithRange:NSMakeRange
(0,1)] uppercaseString]];


On Apr 8, 12:17 am, Dmitry Chestnykh <dmi...@codingrobots.com> wrote:
> Так сделать нельзя, оператор & требует
> lvalue
>
> (хрень, которую можно поставить в левую
> часть присвоения, типа:
> letter = 100; // lvalue
> [itemToScanMutableString characterAtIndex:0] = 100; // не катит )
>
> Так что оставь переменную -- да и
> читабельнее так будет.
>

> -- Dmitry Chestnykh.

Reply all
Reply to author
Forward
0 new messages