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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> strstr, utf8 
V
    Опции темы
chubaka
Дата 26.3.2008, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть обьект std::string string1, содержащий русские символы. Нужно узнать, присутствует ли в нем строка std::string string2, тоже содержащая русские символы. 

С strstr не получается.

Как можна решить задачу максимально просто ?

Это сообщение отредактировал(а) chubaka - 26.3.2008, 07:03
PM MAIL   Вверх
korian
Дата 26.3.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
chubaka
Дата 26.3.2008, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Компилятор gcc, система unix.

mbstring.h не нашел у себя
PM MAIL   Вверх
Dennnis
Дата 26.3.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 4



int pos = (int)string1.find(string2.c_str());
if(pos == -1)
{
//не нашел
}
--------------------
Get Rich or Die Tryin'
PM   Вверх
korian
Дата 26.3.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Dennnis @  26.3.2008,  08:43 Найти цитируемый пост)
string1.find(string2.c_str());

угу, я тоже сначала написал что-то подобное  smile 
только у него utf-8

PM   Вверх
chubaka
Дата 26.3.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



korian, именно. find,strstr не работают
PM MAIL   Вверх
korian
Дата 26.3.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



если у вас нету функции:
unsigned char * _mbsstr(const unsigned char *s1, const unsigned char *s2);
я даже хз, что тут посоветовать... имху переходить в ASCII или в UNICODE

PM   Вверх
chubaka
Дата 26.3.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Немного конкретизировал задачу. Перегнал данные в wchar_t, но всеравно не ищет. Код:

Код

    std::string limit_string, search_for;

    // ..., записываем данные в limit_string и search_for    

    wchar_t *w_limit_string = new wchar_t[limit_string.length()+1];
    wchar_t *w_search_for = new wchar_t[search_for.length()+1];
    size_t my_result;
    my_result = mbstowcs(w_search_for, search_for.c_str(), search_for.length());    
    my_result = mbstowcs(w_limit_string, limit_string.c_str(), limit_string.length());
    
    w_limit_string[limit_string.length()] = '\0';
    w_search_for[search_for.length()] = '\0';
    
    const wchar_t *w_limit_string_const = w_limit_string;
    const wchar_t *w_search_for_const = w_search_for;
    
    if (wcsstr(w_limit_string_const, w_search_for_const))
    {
    std::cout << "true";
    }
    else
    {
    std::cout << "false";
    }
    
    delete [] w_search_for;
    delete [] w_limit_string;

PM MAIL   Вверх
bsa
Дата 26.3.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А может вместо std::string спользовать std::wstring? С ним все работает.
PM   Вверх
korian
Дата 26.3.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(chubaka @  26.3.2008,  11:14 Найти цитируемый пост)
    my_result = mbstowcs(w_search_for, search_for.c_str(), search_for.length());    
    my_result = mbstowcs(w_limit_string, limit_string.c_str(), limit_string.length());
    
    w_limit_string[limit_string.length()] = '\0';
    w_search_for[search_for.length()] = '\0';

а эта функция (mbstowcs) нули сама не ставит?
если у вас limit_string и search_for это объекты std::string'а, то length() для них вычисляется не правильно.
и если надо записывать нули, то надо указывать вайдовский ноль:
w_limit_string[<я хз как длину определить>] = L'\0';

Добавлено @ 13:49
почитал про mbstowcs...
попробуйте так:
Код


    std::string limit_string, search_for;

    // ..., записываем данные в limit_string и search_for    

    unsigned long limit_string_len = _mbslen(limit_string.c_str()); //тут может _mbstrlen, если того нету
    unsigned long search_for_len = _mbslen(search_for.c_str());

    wchar_t *w_limit_string = new wchar_t[limit_string_len];
    wchar_t *w_search_for = new wchar_t[search_for_len];
    size_t my_result;
    my_result = mbstowcs(w_search_for, search_for.c_str(), search_for_len);
    my_result = mbstowcs(w_limit_string, limit_string.c_str(), limit_string_len);
    
    const wchar_t *w_limit_string_const = w_limit_string;
    const wchar_t *w_search_for_const = w_search_for;
    
    if (wcsstr(w_limit_string_const, w_search_for_const))
    {
    std::cout << "true";
    }
    else
    {
    std::cout << "false";
    }
    
    delete [] w_search_for;
    delete [] w_limit_string;


Это сообщение отредактировал(а) korian - 26.3.2008, 13:51
PM   Вверх
chubaka
Дата 26.3.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



korian, на счет нулей - не знаю, просто перестраховался. Пробовал и так и так.

На счет длины - вы не правы. 

Да, char[5] и wchar_t[5] занимают разное количество памяти, но длина текста у них аналогичная. В первом случае каждый символ - 8 бит, во втором - 16.

Добавлено через 2 минуты и 12 секунд
Уверяю вас, дело не в длине. Я проверял вручную переменные которые образовались, значения у них - правильные. 

Это сообщение отредактировал(а) chubaka - 26.3.2008, 13:50
PM MAIL   Вверх
korian
Дата 26.3.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(chubaka @  26.3.2008,  12:49 Найти цитируемый пост)
На счет длины - вы не правы. 

прав  smile 
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
PM   Вверх
chubaka
Дата 26.3.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



korian, понял =) спасибо )

По поводу вашего примера - _mbslen (также как и _mbsstr, выше писал) - у меня ведь ее нет =)) была бы, я думаю давно решил бы проблему перегоном в unsigned char. 

Где найти mbstring.h и библиотеку для него ? FreeBDS.
PM MAIL   Вверх
korian
Дата 26.3.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



тогда посмотрите значения w_limit_string_const и w_search_for_const
они нормальные? если да, то что-то уж очень все странно...
PM   Вверх
chubaka
Дата 26.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



korian, да, нормальные. Но русский в w_limit_string_const - кракозябрами, а в w_search_for_const - нормальный. Хочу перегнать в unsigned char, но нужна _mbsstr.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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