Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > макрос/функция Isalpha (ctype.h)


Автор: Quanzi 25.12.2006, 16:33
Нужно заставить этот макрос понимать русский. Я собственно знаю, как это сделать теоретически, но есть ли у кого-нибудь уже готовое?
А то писать проверки для всех кодировок не хочется...
 smile 

<locale> не подошло, ибо невозможно его использовать с кодом в С.
Что-то аналогичное для С есть?
Компилятор - Visual Studio 6.

Автор: witex 25.12.2006, 18:54
можно попробываться вначале перевести CharToOem а потом уже проверять через IsAlpha проверять!

Автор: Earnest 25.12.2006, 19:04
setlocale из <locale.h> - это C.

Автор: Quanzi 25.12.2006, 22:28
Цитата(Earnest @ 25.12.2006,  19:04)
setlocale из <locale.h> - это C.

Можно пример?
Просто сижу тыкаюсь... может и доберусь до того, как делать, но боюсь нескоро  smile 

c:\program files\microsoft visual studio\vc98\include\eh.h(32) : fatal error C1189: #error :  "eh.h is only for C++!" - вот что выдает вообще файл <locale>... <clocale> такого не выдает.

Так... как подключить и создать локаль - понял. Методом профессора Тыка.
Теперь непонятно - на 
Код

isalpha(*argument,locale)
 мне выдается d:\circle-3.1\src\interpreter.c(1135) : warning C4002: too many actual parameters for macro 'isalpha'...
Я понимаю, что надо где-то найти функцию с двумя параметрами, но ГДЕ?
Пример, плз  smile 

Автор: Earnest 26.12.2006, 08:32
Ты перепутал локали из стандартной библиотеки C++ и СRT. Они действительно похожи, но не совсем: в CRT есть только одна общая локаль, которую нужно установить функцией setlocale. Подключать надо <locale.h>, а не <locale>. Последняя - это как раз c++.
Сначала вызови setlocale, чтобы установить нужную локаль, потом используй макрос isalpha, который имеет только один аргумент - проверяемый символ.
Примера, извини, под рукой нет.

Автор: Quanzi 26.12.2006, 08:47
Благодарю.
А какая локаль русская? .866?
или russian_russian?
Название интересует, ибо не знаю smile

Автор: Earnest 26.12.2006, 08:54
В зависимости от кодировки: если Windows, то russian. И еще, второй аргумент можно поставить LC_ALL, конечно, но тогда и другие региональные настройки (вывод даты, дес. точка и прочее изменятся, что, по-моему, не очень удобно). Но можно тпоставить олько специфический, для сравнения строк, LC_COLLATE, кажется.

Автор: Quanzi 26.12.2006, 09:07
Спасибо... 
Нда... понял, почему в каком-то из прошлых постов писали про траблы с символами. Локаль меняет кодировку - и Си начинает вызывать вместо 'ъ', например, всякие спецсимволы. Буду думать как починить...

Автор: Quanzi 26.12.2006, 14:19
Методом Тыка - для русских символов в Си нормально работает setlocale(LC_ALL,".866").
Проблема осталась другая, перенесу в другой топик...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)