Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск рус. слова в переменной типу STRING, поиск слово рус. стринг string 
:(
    Опции темы
boostcoder
Дата 24.4.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(volatile @  23.4.2012,  23:30 Найти цитируемый пост)
Инициализирует именно данными однобайтовыми символами,  а не юникодом, закомуфлированным под однобайтовую последовательность. (ut8 это тоже юникод)

странно. а для чего тогда в стандарт ввели расширенные символы? как их предлагаешь использовать без строки?
PM WWW   Вверх
volatile
Дата 25.4.2012, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  24.4.2012,  10:30 Найти цитируемый пост)
а для чего тогда в стандарт ввели расширенные символы? как их предлагаешь использовать без строки? 

Юникод, имеющий одинаковый размер для любых символов, это и нужно использовать.

boostcoder, я скажу свое имхо.
В string или в char* нелья использовать UTF8, (Ну только если считать, записать и все). Любое мало-мальски активное использование ведет к нехорошим вещам.
Потому-что риск получить в итоге глючную, невменяемую программу - очень высок.
Гораздо выше, например чем при использвании printf. Но про принтф, все обязательно любят повозмущаться, что де это нарушение безопастности типов, и т.д, и т.п. В принципе я согласен, но в реале, я никогда не встречал проблем с printf'ом.
А вот с UTF8, я встречал и встречаю очень часто. Скажу даже больше, буквально в любой программе, которая активно использует UTF8 с нац. символами - будет ошибка! ну в 99,5%, может быть.  smile 

Почему-же так люди возмущаются на printf, и спокойно используют UTF8?
Потому-что дядя Страус, так сказал... Но про UTF8, он как-то не обмолвился...
Знал бы он что с этим программеры делают... думаю ужаснулся бы старик..

Предлагаю всем такую задачку, не будем брать сложное. Возьмем самое элементарное, для начинающих:
Написать функцию возвращающую истину, если в строке есть русская 'А', и ложь, если ее там нет.
На вход подается UTF8 строка содержащая произвольные расширенные (в т.ч. может быть и латинские) символы.
Код

// Версия для нормальной кодировки
bool russsianA (const std::string & str)
{
   return (str.find('А') != std::string::npos);
}

Я не знаю как без привлечения "высшей математики", написать такую функцию.
Чтоб не скучно было, (++rep)  любому, кто напишет правильную функцию, используя стандартые средства   smile 


Это сообщение отредактировал(а) volatile - 25.4.2012, 00:59
PM MAIL   Вверх
borisbn
Дата 25.4.2012, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(volatile @  25.4.2012,  00:29 Найти цитируемый пост)
Написать функцию возвращающую истину, если в строке есть русская 'А', и ложь, если ее там нет.

Ваша функция матюкается (куча warning'ов), но работает
http://liveworkspace.org/code/ba64c628d664...dce4f854bc80ebe
и даже так
http://liveworkspace.org/code/8c3d9e5dbf29...b70acb5eed65b72

так что volatile.rep++;  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 25.4.2012, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот исправленные версии варианта borisbn.
http://liveworkspace.org/code/6455efa5ee33...227d30e08dbe48a
http://liveworkspace.org/code/1e9d68b3a883...837e658c28a0a8c


Цитата(volatile @  25.4.2012,  00:29 Найти цитируемый пост)
В string или в char* нелья использовать UTF8, (Ну только если считать, записать и все). Любое мало-мальски активное использование ведет к нехорошим вещам.
Потому-что риск получить в итоге глючную, невменяемую программу - очень высок.

страшные вещи ты говоришь.
никогда не использовал другого юникода кроме UTF8. и с UTF8 никаких проблем не замечал.
PM WWW   Вверх
borisbn
Дата 25.4.2012, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boostcoder @  25.4.2012,  08:08 Найти цитируемый пост)
вот исправленные версии варианта borisbn.

гыыы. а чего ж результаты отличаются ?

Цитата(boostcoder @  25.4.2012,  08:08 Найти цитируемый пост)
 и с UTF8 никаких проблем не замечал. 

м.б. потому, что с русскими буквами не работал ? Только с английскими ?

Это сообщение отредактировал(а) borisbn - 25.4.2012, 09:01


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 25.4.2012, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  25.4.2012,  09:00 Найти цитируемый пост)
а чего ж результаты отличаются ?

потому что в строке 'Тут русская ' - 22 байта.
буква 'A' - 23


Это сообщение отредактировал(а) boostcoder - 25.4.2012, 09:15
PM WWW   Вверх
borisbn
Дата 25.4.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(borisbn @  25.4.2012,  09:00 Найти цитируемый пост)
а чего ж результаты отличаются ?

я про это
Код

int where_russsianA_str (const std::string & str) {
   return str.find("А");
}
int where_russsianA_char (const std::string & str) {
   return str.find('А');
}

int main()
{
   std::string rus = "Тут русская А присутствует";
   std::cout << where_russsianA_str( rus ) << std::endl;
   std::cout << where_russsianA_char( rus ) << std::endl;
}

Вывод
Цитата
22
23

http://liveworkspace.org/code/2bb3580795d1...83e17a424a71632


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 25.4.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



русская 'А' состоит из двух байт.
поэтому where_russsianA_char() не должна корректно работать.

Добавлено через 58 секунд
я использую эту хидер-онли, STL совместимую, микро-либу.
PM WWW   Вверх
mes
Дата 25.4.2012, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  24.4.2012,  08:25 Найти цитируемый пост)
Он действительно хорош только при передаче данных по медленному или дорогому каналу. В ЯП я бы его просто запретил бы. Он там вообще нинужен 

однако ж ) 

Цитата(volatile @  24.4.2012,  23:29 Найти цитируемый пост)
Юникод, имеющий одинаковый размер для любых символов, это и нужно использовать.

Вы смешиваете понятие "строка" с понятием "контейнер для строки".. smile Это не "специальный" юникод имеет одинаковую ширину символа, а юникод помещает в такой контейнер, ячейка которого способна вместить любой символ юникода.. Ну а выбор контейнера зависит от задачи.. 
Если нужно оперировать посимвольно, то конечно лучше широкосимвольная строка, но есть ряд задач когда односимвольная строка будет подходящим контейнером.. 

Цитата(volatile @  23.4.2012,  12:29 Найти цитируемый пост)
А работать с UTF8 в std::string, как с обычным чар - хождение по краю пропасти.

если знаешь с чем работаешь - никакой пропасти smile

Добавлено через 5 минут и 12 секунд
P.S. о том, в какой кодировке хранить исходники, отдельный вопрос ..  В любой случае при использовании нац символов это ложится на плечи программиста и должно согласовываться отдельным соглашением.. 



--------------------
PM MAIL WWW   Вверх
volatile
Дата 26.4.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Спасибо друзья! Спасибо что лишний раз наглядно показали, что использовать utf8 - крайне опасно.
Увы, ни одна из ваших функций не правильна.

Рассмотрю только последнюю, "исправленную" версию от boostcoder
(варианты от borisbn, как минимум страдают тем же самым)

Итак
Цитата

bool russsianA (const std::string & str)
{
   return (str.find("А") != std::string::npos);
}

Программа ищет подстроку "А" в заданной строке. Вроде бы все ок, не так ли?
Но давайте внимательно посмотрим, что происходит.
hex представление буквы А в utf8 :
Код
D0 90


Теперь рассмотрим строку в которой происходит поиск. Допустим она состоит из двух букв "XY"
Пусть на месте буквы Х находится любой символ с кодировкой: 
Код
?? D0
 (Вместо ?? подставьте любой код в диапазоне 80-FF)

а на месте буквы Y находится любой символ с кодировкой:
Код
90 ??


Соответственно, вся строка "XY", выглядит так:
Код
?? D0 90 ??

Таких сочетаний, как вы понимаете 128*128= 16384 штук

Отправляем одну из таких строк "XY" на поиск в ней русской 'А', и о чудо!, в троке "XY" оказывается присутствует 'A'!

Тут можно возразить что строки "XY" никогда не встретятся.
А вы точно сможете дать гарантию, что ни один из 16384 вариантов, никогда не встретится ?
Это одни из тех багов, которые сидят в программах вечно, и когда-нибудь, по законам Мерфи в момент когда смогут нанести максимальный ущерб, они сработают.
И вся беда в том, что такая ошибка не ловится. Она просто не воспроизводится у программиста.
И он матерится на "долбанных юзеров", у которых баги, неизвестно откуда..

Напомю, здесь мы рассмотрели только самый невинный вариант - Поиск символа в константной строке.
Варианты с форматированием винчестера, на отрицательный ответ юзера, оставляю на вашу фантазию...

Цитата(mes @  25.4.2012,  10:14 Найти цитируемый пост)
если знаешь с чем работаешь - никакой пропасти 

Аболютно универсальный ответ, на любое сомнитльное решение.  smile 


Это сообщение отредактировал(а) volatile - 26.4.2012, 00:30
PM MAIL   Вверх
boostcoder
Дата 26.4.2012, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



слишком много букаф %)
воспроизведи то о чем говоришь, в примере.
PM WWW   Вверх
volatile
Дата 26.4.2012, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  26.4.2012,  01:06 Найти цитируемый пост)
слишком много букаф %)
воспроизведи то о чем говоришь, в примере. 

Цитата(volatile @  26.4.2012,  00:23 Найти цитируемый пост)
И вся беда в том, что такая ошибка не ловится. Она просто не воспроизводится у программиста.


boostcoder, В принципе хоть букв и много, смысл там простой. Может найтись случайное сочетание, которое даст ложное срабатывание.

PM MAIL   Вверх
volatile
Дата 26.4.2012, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Ладно, ребята. убеждать не буду, больше.
Используйте utf8
В принципе mes, провильно сказал.
Цитата(mes @  25.4.2012,  10:14 Найти цитируемый пост)
если знаешь с чем работаешь - никакой пропасти


Просто я много раз видел, когда например под отведенные три символа английских, поверх писали 3 символа русских.
Щас просто, не приходят в голову все варианты багов которые я видел.
Дай бог чтоб у вас такого никогда не было.

PM MAIL   Вверх
boostcoder
Дата 26.4.2012, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



остается гадать...
PM WWW   Вверх
borisbn
Дата 26.4.2012, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, только не подумайте, что я защищаю utf-8 в программах. Я как раз противник этой недокодировки (кроме передачи данных) и нигде в исходниках её не использую.
Однако, Вы неправы насчёт того, что комбинация, похожая на 'А' может появиться из двух половинок двух символов. Дело в том, что любая русская буква состоит из двух таких байт
Цитата
110xxxxx 10xxxxxx

и ситуации
Цитата(volatile @  26.4.2012,  00:23 Найти цитируемый пост)
Соответственно, вся строка "XY", выглядит так:

?? D0 90 ??

быть не может в принципе.

источник


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1225 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.