Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с русскими буквами (символами)

43K
03 ноября 2008 года
arhad
4 / / 31.10.2008
Задача состоит в том, чтобы запретить пользователю вводить в editbox любые символы кроме числовых, запятой или точки

Написан такой код для кнопки и двух editbox, в один из которых вводятся символы, в другом выводятся, если проверка прошла, или выдается сообщение, что такие символы недопустимы:
Код:
UpdateData(true);
    const char *a = LPCTSTR(m_1);
int i=0;

while(a != '\0')
    {
               if(isdigit(a) || a==',' || a=='.' || a=='-')

            m_2=m_1;
        else
            {AfxMessageBox("Можно только цифры и точку(запятую)");
            break;}
           
        i++;
    }
UpdateData(false);


Алгоритм срабатывает на любые символы, кроме русских букв, причем некоторых. Например, на букву й не срабатывает, на ц и у срабатывает, на к не срабатывает и т.д.
Подозреваю, что компилятор просто воспринимает эти буквы, как числа и, соответственно, пропускает их. Какие пути решения этой проблемы возможны?

Заранее благодарен.

Забыл добавить, пишу в Visual c++ 6.0
538
03 ноября 2008 года
AVDEY
188 / / 17.11.2005
Я вот недавно столкнуся с похожей проблемой, мне надо было перевести все символы в верхний регистр. Есть такая функция strupr - но дело в том что она работает только с латинским алфавитом. (пишу тоже на VC6). Так я написал свою функцию, что и вам советую.
Код:
bool funct(const char *a)
{
int i=0;

while(a != '\0')
    {
               if( !((','<=a) && (a<='9') ) && a!='/'))
                   return FALSE;
        i++;
    }
 return TRUE;
}

UpdateData(TRUE);

if(funct(LPCTSTR(m_1))) m_2=m_1;

else AfxMessageBox("Можно только цифры и точку(запятую)");
   
UpdateData(FALSE);

Или функцию можно записать и так
Код:
bool funct(const char *a)
{

while(*a)
    {
               if( !((','<=*a) && (*a<='9') ) && *a!='/'))
                   return FALSE;
        *a++;
    }
 return TRUE;
}
43K
04 ноября 2008 года
arhad
4 / / 31.10.2008
AVDEY

Благодарю! Хотя достаточно было бы и этой строчки:

 
Код:
if( ((','<=a) && (a<='9') ) && a!='/'))


Я хотел как раз исключить русские буквы таким способом, но не получилось, ибо начинающий я. :)

Для тех кому это тоже нужно, хочу заметить, что в этой строчке не должно быть первого отрицания (если я не прав, поправьте меня):

 
Код:
if( !((','<=a) && (a<='9') ) && a!='/'))
538
04 ноября 2008 года
AVDEY
188 / / 17.11.2005
Отрицание должно быть, так как если символ не находиться в заданом диапазоне, то есть он не является цифрой, запетой и.т.д. Тогда функция возвращает FALSE. И прекращает проверку. В ином случае просмотр строки проходит до конца и возвращается TRUE. И только тогда присваиваться m_2=m_1;
А у вас эта операция происходит каждый раз если выполняется условие if(isdigit(a) || a==',' || a=='.' || a=='-').
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог