Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
1

Поиск подстроки в строке, кодировки

26.06.2017, 02:32. Показов 1413. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Мне нужна помощь в проблеме с кодировками..
Есть txt файл, в котором пишутся слова по принципу: "текст1|текст2|текст3". Я считываю их, разделяю в массив char BadWords на 500 ячеек (это максимум). После в неком цикле я с помощью tinyxml2 из xml файла получаю указатель на текст, считываю его. После нужно циклом этот текст найти среди ячеек массива BadWords, и вывести результат - нашло ячейку/нет. Вроде бы по коду все правильно получилось, но в итоге сравнение не работает с кириллицей. Тоесть в txt файле, например, в списке есть слово "рублей", а в xml файле "0 рублей потрачено" (текст "с неба" взял). Получает значения все правильно, но вот не ищет подстроку "рублей" в строке "0 рублей потрачено". Скорее всего проблема с кодировкой, но я не могу понять как сделать правильно, пробовал все уже, в т.ч. все у wchar_t переводить, и использовать WideCharToMultiByte/MultiByteToWideChar.. На tinyxml2 в данном случае не стоит заострять внимание, главное что он возвращает мне указатель на текст в xml файле - const char* . Помогите пожалуйста

Текущий код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
char BadWords[100][50];// 100 штук по 50 символов
 
// цикл кода tinyxml, получение указателя на текст:
const char* txt = attachment->FirstChildElement("link")->FirstChildElement("title")->GetText();
for (int i = 0; i < 100; i++)
{
    if (strlen(BadWords[i]) == 0) continue;
    if (txt, BadWords[i])) { /*совпадение*/ }
}

Пробовал еще текст с указателя копировать так как ниже, но без изменений:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
char BadWords[100][50];// 100 штук по 50 символов
 
char text[50];
// цикл кода tinyxml, получение указателя на текст:
const char* txt = attachment->FirstChildElement("link")->FirstChildElement("title")->GetText();
strcpy(text, txt);
for (int i = 0; i < 100; i++)
{
    if (strlen(BadWords[i]) == 0) continue;
    if (text, BadWords[i])) { /*совпадение*/ }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2017, 02:32
Ответы с готовыми решениями:

Поиск подстроки в строке
Здравствуйте. Очень нужна программа поиска подстроки в строке. Действительно оч нужна. точная...

Поиск подстроки в строке
Вообщем,не знаю почему в программе не работает считывание с файла,если в консоли всё ищет...

Поиск подстроки в строке
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int...

Поиск подстроки в строке
Всем доброе утро! Задачка звучит так - найти самую длинную подстроку в строке без повторяющихся...

6
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.06.2017, 03:25 2
Цитата Сообщение от Vasiliyy Посмотреть сообщение
C++
1
if (txt, BadWords[i])
Это как понять?
0
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
26.06.2017, 03:44  [ТС] 3
nd2, упс, опечатка)) Правильно так:
C++
1
2
3
if (strstr(txt, BadWords[i]))// в 1 спойлере
 
if (strstr(text, BadWords[i]))// в 2 спойлере
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.06.2017, 03:49 4
Цитата Сообщение от Vasiliyy Посмотреть сообщение
Правильно так:
В отладчике посмотри, что в каком виде там.
1
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
26.06.2017, 04:09  [ТС] 5
nd2, хм, получается что tinyxml2 кириллицу не видит? Крякозябри вместо слова "рублей" в данном случае на скрине..
Можно ли это исправить как-то, либо единственный выход - юзать regex вместо всех циклов tinyxml2 и strstr?
Миниатюры
Поиск подстроки в строке, кодировки  
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.06.2017, 18:59 6
Лучший ответ Сообщение было отмечено Vasiliyy как решение

Решение

Цитата Сообщение от Vasiliyy Посмотреть сообщение
получается что tinyxml2 кириллицу не видит? Крякозябри вместо слова "рублей"
Почему обязательно не видит? Видит, но в другой кодировке (скорее всего, UTF-8).
1
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
26.06.2017, 20:50  [ТС] 7
Вообщем методом тыка получилось следующее:
C++
1
2
3
4
5
// из xml файла указатель const char* преобразовываем в wchar_t title
    MultiByteToWideChar(CP_UTF8, 0, attachment->FirstChildElement("link")->FirstChildElement("title")->GetText(), -1, title, 50);
 
// этот же title преобразовываем в char text для дальнейшей работы
    WideCharToMultiByte(1251, 0, title, -1, text, sizeof text, NULL, NULL);
0
26.06.2017, 20:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2017, 20:50
Помогаю со студенческими работами здесь

Поиск подстроки в строке
Всем привет. Прорабатывал пример из книжки Шилдта: #include &quot;iostream&quot; using namespace...

Поиск в строке подстроки
Здравствуйте! Есть строка , в которой надо найти слово, удалить его и выдать значение порядкового...

Поиск подстроки в строке
Добрый вечер. Помогите пожалуйста с заданием, нужно срочно его сделать. Сам текст: даны 2 массива...

Поиск подстроки в строке
Найти множество всех слов, которые встречаются в каждом из 2 заданных предложений.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru