![]() |
|
Модераторы: bsa |
![]()
|
|
| factura |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.1.2014 Репутация: нет Всего: нет |
Среда Visual C++2010
По логике должно работать, но почему то кириллица игнорируется, пытался исправить подключением библиотеки locale не помогло. При использовании одной лишь латиницы алгоритм работает... В чём может быть проблема?
Модератор: не забываем пользоваться кнопочкой "Код" |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Довольно любопытная ситуация. Имеем неправильное условие Здесь мало того, что 'я' маленькая (хотя отсев идёт заглавных букв), так ещё и 'A' английская. Здесь мало того, что && стоит вместо ||, так ещё и s[i+1] знаковая, то есть для русских букв имеет отрицательное значение. Лучший выход - написать функцию is_letter и пользоваться ей:
Кроме того, Вы указываете разделитель: А если встретилась точка, запятая, тире, ...? И что делать с цифрами? В начале Вы проверяете первый символ: но только на принадлежность к английскому алфавиту. Вообще, я бы разделил все символы на буквы и не буквы (что не буквы, то разделитель). И соответственно считал бы слова... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Это потому, что есть два объяснения и два неисключающих варианта решения:
1. Потому что мировую историю последние лет тридцать писали амеры. И писали, разумеется, на латинице. А не на кириллице и не на иероглифах, и не на арабской вязи. Следовательно, всё заточено в первую очередь под латиницу (а тех же самых однобайтовых вариантов кодировок кириллицы - дочерта, и где-то символы расположены так, а где-то по-другому). Как исправить? БЫть круче всех (и амеров, разумеется). 2. Есть либа <locale>, в которую включены разные функции (макросы) для использования. Для определения букв используется 'isletter'. Но и тут есть своя тонкость. Ввиду того, что однобайтовых кириллических кодировок для русских символов многовато, то 'isletter' работает только для UNICODE (под Windows точно). Так что тут не надо писать свой обработчик определения для multibyte кодировки, а надо переводить всё в Unicode-кодировку (посредством функции mbstowcs и более её безопасных аналогов), а там уже применять 'isletter'. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |