![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
Есть обьект std::string string1, содержащий русские символы. Нужно узнать, присутствует ли в нем строка std::string string2, тоже содержащая русские символы.
С strstr не получается. Как можна решить задачу максимально просто ? Это сообщение отредактировал(а) chubaka - 26.3.2008, 07:03 |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
для utf-8 вот это:
unsigned char * _mbsstr(const unsigned char *s1, const unsigned char *s2); Это сообщение отредактировал(а) korian - 26.3.2008, 10:17 |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
Компилятор gcc, система unix.
mbstring.h не нашел у себя |
|||
|
||||
| Dennnis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
int pos = (int)string1.find(string2.c_str());
if(pos == -1) { //не нашел } --------------------
Get Rich or Die Tryin' |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
||||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, именно. find,strstr не работают
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
если у вас нету функции:
unsigned char * _mbsstr(const unsigned char *s1, const unsigned char *s2); я даже хз, что тут посоветовать... имху переходить в ASCII или в UNICODE |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
Немного конкретизировал задачу. Перегнал данные в wchar_t, но всеравно не ищет. Код:
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А может вместо std::string спользовать std::wstring? С ним все работает.
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
а эта функция (mbstowcs) нули сама не ставит? если у вас limit_string и search_for это объекты std::string'а, то length() для них вычисляется не правильно. и если надо записывать нули, то надо указывать вайдовский ноль: w_limit_string[<я хз как длину определить>] = L'\0'; Добавлено @ 13:49 почитал про mbstowcs... попробуйте так:
Это сообщение отредактировал(а) korian - 26.3.2008, 13:51 |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, на счет нулей - не знаю, просто перестраховался. Пробовал и так и так.
На счет длины - вы не правы. Да, char[5] и wchar_t[5] занимают разное количество памяти, но длина текста у них аналогичная. В первом случае каждый символ - 8 бит, во втором - 16. Добавлено через 2 минуты и 12 секунд Уверяю вас, дело не в длине. Я проверял вручную переменные которые образовались, значения у них - правильные. Это сообщение отредактировал(а) chubaka - 26.3.2008, 13:50 |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
прав ASCII - для символа 8 бит UTF-8 (он же мультибайт) - длина символа 8 бит или 16 бит UTF-16 (он же UNICODE, wchar_t) - длина символа 16 бит. если использовать функцию ASCII (strlen) для UTF-8, то результат не предсказуем... хотя может и предсказуем, если знать кодирование в UTF-8, я его не знаю. если в UTF-8 возможет вариант, что один символ записывается как \0xAB\0x00, тогда strlen будет возвращать значение меньше истинной длины. а в общем случае, если такого варианта не может быть, то strlen будет возвращать длину больше реальной. Это сообщение отредактировал(а) korian - 26.3.2008, 13:56 |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, понял =) спасибо )
По поводу вашего примера - _mbslen (также как и _mbsstr, выше писал) - у меня ведь ее нет =)) была бы, я думаю давно решил бы проблему перегоном в unsigned char. Где найти mbstring.h и библиотеку для него ? FreeBDS. |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
тогда посмотрите значения w_limit_string_const и w_search_for_const
они нормальные? если да, то что-то уж очень все странно... |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, да, нормальные. Но русский в w_limit_string_const - кракозябрами, а в w_search_for_const - нормальный. Хочу перегнать в unsigned char, но нужна _mbsstr.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |