По идее должно срабатывать прямое условие, потому что в файле admin.txt
прписана строка admini, но все время срабатывает обратное условие.
В чем тут дело
Здравствуйте edvin, Вы писали:
E>По идее должно срабатывать прямое условие, потому что в файле admin.txt E>прписана строка admini, но все время срабатывает обратное условие. E>В чем тут дело
В данном случае сравниваются указатели на первый элемент массива, они всегда различны,
используй strcmp, wstrcmp
O$>Здравствуйте edvin, Вы писали:
E>>Здравствуйте! E>>Есть следующий код, подключен Unicode:
E>> E>>
E>>if (buf1==buf2)
E>>
O$>готовься, за такое сравнение строк будут больно и долго пинать
Дас со строками в С++ у меня вечная головная боль а еще плюс Unicode.
К сожалению не встречал исчерпывающей документации по строкам
Здравствуйте edvin, Вы писали:
E>Здравствуйте Odi$$ey, Вы писали:
O$>>Здравствуйте edvin, Вы писали:
E>>>Здравствуйте! E>>>Есть следующий код, подключен Unicode:
E>>> E>>>
E>>>if (buf1==buf2)
E>>>
O$>>готовься, за такое сравнение строк будут больно и долго пинать :)) E>Дас со строками в С++ у меня вечная головная боль а еще плюс Unicode. E>К сожалению не встречал исчерпывающей документации по строкам
либо приводить WCHAR->char, либо char->WCHAR,
либо с самого начала строку-образец делать юникодной:
WCHAR buf2[] = L"admini";
2) юникодные файлы часто предваряются сигнатурой порядка байтов в WCHAR. Это либо FF,FE — Low-Endian (младший байт вперед) — cовместимый с платформой Intel), либо FE,FF — Big Endian (старший байт вперед) — совместимый с платформой DEC.
Поэтому неплохо бы проверить первый символ, считанный из файла, на предмет сигнатуры.
Если равен WCHAR(0xFEFF) — то это low-endian, и дальше все хорошо.
Если равен WCHAR(0xFFFE) — то big-endian, придется повозиться либо с конверсией в low-endian (переставлять байты местами), либо со сравнением. Впрочем, можно послать на.
Если не равен — считать по умолчанию.
Перекуём баги на фичи!
Re[2]: Сравнение строк
От:
Аноним
Дата:
24.10.02 12:11
Оценка:
Здравствуйте Кодт, Вы писали:
К> WCHAR w = *(ws++); К> unsigned char c = *(cs++); // WCHAR — беззнаковый, char тоже желательно привести К> if(w < u) return -1; К> if(w > u) return 1;
И какую же кодовую таблицу имеете в виду, товарищ?
Да так, по моему не очень хорошо сравнивать UNICODE и ANSI строки, мне нравится использовать макросы из <atlcov.h>
A2W, W2A, A2T, W2T, ... и тому подобные, они правда выделяют память на стеке, так что не рекомендую их использовать в блоке catch например, а так довольно удобно:
wstrcmp(A2W(ansistr), unicodestr);
Re[3]: Сравнение строк
От:
Аноним
Дата:
24.10.02 12:30
Оценка:
Здравствуйте __Nicolay, Вы писали:
N>A2W, W2A, A2T, W2T, ... и тому подобные, они правда выделяют память на стеке, так что не рекомендую их использовать в блоке catch например, а так довольно удобно:
Есть еще одна известная проблема с ними: использующих их код уязвим, если ему подсунут чрезмерно большую строку (можно элементарно грохнуть программу, переполнив стек!).
Здравствуйте Аноним, Вы писали:
А>Есть еще одна известная проблема с ними: использующих их код уязвим, если ему подсунут чрезмерно большую строку (можно элементарно грохнуть программу, переполнив стек!).
Да, если конвертить строки с ручным выбором кодировки, то похоже только WideCharToMultiByte и MultiByteToWideChar,
или есть еще что-нибудь?
Здравствуйте __Nicolay, Вы писали:
N>Да, если конвертить строки с ручным выбором кодировки, то похоже только WideCharToMultiByte и MultiByteToWideChar, N>или есть еще что-нибудь?
С кодировкой Western (Win-1252) все просто: WCHAR wc = (WCHAR)(unsigned char)(c).
ASCII, будучи подмножеством всех кодировок, в том числе и Western — то же самое.
Здравствуйте Кодт, Вы писали:
К>С кодировкой Western (Win-1252) все просто: WCHAR wc = (WCHAR)(unsigned char)(c). К>ASCII, будучи подмножеством всех кодировок, в том числе и Western — то же самое.
Речь идет обо всех остальных кодировках например Win-1251