metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2006-05-20 09:51 pm

С++

Уже успел наткнуться на маразматический глюк в isspace.

У Страуструпа есть такой пример функции для пропускания whitespace в входном потоке:
char c;
while(f.get(c)) {
if(!isspace(c))
{
f.putback(c);
break;
}
}

Так вот если эту хрень откомпилировать c debug версией MSVC библиотек, и подать на вход файл с русскими буквами, она аккуратно сваливается в assert. Потому что signed char для русских букв - это отрицательное значение, и преобразуется оно в отрицательное int, которое внутри isspace проверяется на попадание в диапазон 0x00-0xFF. Не попадает и сваливается в assert.

пока обошел аццкой комбинацией преобразований типов if(!isspace(((unsigned char)c)))

[identity profile] yurri.livejournal.com 2006-05-20 07:15 pm (UTC)(link)
Юникод.

[identity profile] kkirsanov.livejournal.com 2006-05-20 07:33 pm (UTC)(link)
Что с юникодом в настроках проекта?

[identity profile] metaclass.livejournal.com 2006-05-20 07:52 pm (UTC)(link)
Шоб я знал :) Тут и проекта то нету - один файл, компилируемый консольным компилятором.
Надо глянуть в ключи компилятора, видимо.

[identity profile] ktn-zoidberg.livejournal.com 2006-05-20 08:49 pm (UTC)(link)
я так и знал... ты таки взялся за C++... ну и хто теперь работать будет?

[identity profile] wlite.livejournal.com 2006-05-20 09:35 pm (UTC)(link)
кстати, вроде говорят что кроме всего все эти функции на is... еще и тормозные, так что практичнее ставить проверку тупым перечислением.