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