#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
псевдоним и использовать его.