Проверьте, все ли CString в нижнем регистре

#visual-c

#visual-c

Вопрос:

 bool CSubliminalDlg::CheckIfWordIsUppercase(CString w)
{
    for(int i = 0; i < w.GetLength(); i  )
    {
        if(islower(w.GetAt(i)))
           return false;
    }

    return true;
}
  

Вышеупомянутая функция продолжает запускать точку останова. Что с этим не так?

Комментарии:

1. Где срабатывает «точка останова» и что она говорит / какую информацию она вам дает?

2. Выражение: (без знака) (c 1) <= 256

3. у меня такое чувство, что это как-то связано с проверкой символов…

Ответ №1:

Наиболее вероятной причиной является то, что CString является CString широкосимвольным, потому что у вас определен Unicode как набор символов по умолчанию: все TCHAR s будут wchar_t широким типом, который в Visual Studio равен 2 байтам.

И наоборот, islower это функция, которая работает с char объемом в 1 байт. Точка останова, которую вы нажимаете, islower проверяет, что входные данные действительно находятся в пределах диапазона символа (или EOF ).

Вы должны использовать tchar.h методы для работы с CString , в данном случае _istlower который является TCHAR вариантом islower , iswlower или _ismbclower . Какая именно, зависит от выбранного набора символов, но важно то, что всегда используется тот же набор, что и CString .

Чтобы немного уточнить это: tchar.h определяет псевдонимы для (большинства) строковых функций в стандартной библиотеке, автоматически выбирая правильный вариант в зависимости от набора символов. Итак, всякий раз, когда вы обнаруживаете, что используете метод, который работает со строками C, и вы хотите использовать его с CString массивами или TCHAR LPTCHAR и т.д., вам захочется найти для него соответствующий tchar.h псевдоним и использовать его.