33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83

Сравнение символов со строкой

14.02.2023, 21:40. Показов 1720. Ответов 31

Студворк — интернет-сервис помощи студентам
Всем читающим привет

Я делаю проект(оптимизатор кода) свой и столкнулся с проблемой перебора символов в строках и последующим сравнением, т.е.:

Т.е. есть у меня такой вектор
C++
1
std::vector<std::string> RegConstants;
туда помещается такая строка, их может быть хоть миллион, т.е. любое количество
Assembler
1
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1]
Мне нужно перебрать все элементы и символы в них, дабы найти, например это RDIx8, т.е. мне нужно перебрать все символы всех элементов, чтобы найти символы обозначения регистров.

Вот мой глючный пример:
Под RegName любой 64-ех битный регистр, т.е. RAXx1 и т.д., далее там у меня зависимости от [Φ, которые будут идти от моего IR кода ,но я сомневаюсь, что эта информация будет полезна, что важно - как я могу сравнить это:
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1] с этим RDIx8?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void RegImmConstantFinderInVectorOfRegConstants(std::string RegName)
            {
                if (RegConstants.size() > 0)
                {
                    for (auto it = RegConstants.begin(); it < RegConstants.end(); it++)
                    {
                        int64_t Index = std::distance(RegConstants.begin(), it);
                        
                        char* CharStringWithTempVarFromReg = new char[RegConstants[Index].length() + 1];
                        strcpy(CharStringWithTempVarFromReg, RegConstants[Index].c_str());
 
                        char* CharRegName = new char[RegName.length() + 1];
                        strcpy(CharRegName, RegName.c_str());
                        for (int j = 0; j < RegConstants[Index].length(); j++)
                        {
                            for (int v = 0; v < RegName.length(); v++)
                            {
                                if (CharStringWithTempVarFromReg[j] == CharRegName[v])
                                {
                                    fmt::print("{}", RegName);
                                }
                            }
                        }
                    }
                }
            }
Я был бы рад какому-нибудь подробному примеру, желательно с использованием stl или более нормальному и быстрому примеру, чем мой, а также более работоспособному, так как сейчас у меня выводится это:
https://ibb.co/GCrLF9n

Как я понимаю выводится дичь выше из-за того, что тут(CharRegName) тоже всё идет по символам и когда находится буква I в RDIx8, то оно видит начало той переменной Imm и сразу выводит RDIx8.

Как я могу в векторе по символьным поиском по всем элементам искать нужные мне элементы?
Т.е. в реальном примере будет так:
ImmOfTextSection(RAXx8)(ζ)[Φ1]
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1]

и я соответственно передаю туда RegName, чтобы найти от чего идет моя переменная от регистра RAX или RDI или R15
ζ - это показывает, что регистр сохранен в стеке.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2023, 21:40
Ответы с готовыми решениями:

Cтрока: вывести в файл все возможные сочетания символов начиная с A, и заканчивая строкой в 16 символов состоящую из Z
Изучая работу со строками в c++ столкнулся с задачей. Есть массив символов английского алфавита от &quot;a&quot; до &quot;Z&quot;, мне...

Сравнение со строкой из файла
Подскажите пожалуйста,как написать сравнение введённой информацией с каждой строкой в имеющемся файле,потому что у меня сравнивается только...

Сравнение хеша md5 с строкой
Здраствуйте. Получен MD5 код некого файла - 8F5B9B73D33E8C99202B5058CB6DCE51 в typedef TMD5. Что нужно сделать, чтобы это можно было...

31
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 19:49  [ТС]
Студворк — интернет-сервис помощи студентам
А так:
Так я вроде так и делал примером ниже..
https://ibb.co/7J3kt5C
0
фрилансер
 Аватар для Алексей1153
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
15.02.2023, 19:51
OSPFv3, "RegConstants" то там зачем? У меня в примере нет его
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 19:57  [ТС]
OSPFv3, "RegConstants" то там зачем? У меня в примере нет его
Ааа, я думал, что итератор тоже счетчик в себе хранит, а он видать указатель хранит, надо будет мне через x64dbg посмотреть...
Да, так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void RegImmConstantFinderInVectorOfRegConstants(std::string RegName, Language_Letters Language_Letters, ZydisDisassembledInstruction instruction, int64_t RegisterValue)
            {
                int FromRegToDependencyInRegConstantsAndToCounter = 1;//(-1) Counter
                int FromRegToNameOfVarInRegConstants = 2;//(-2) NameOfVar
                if (RegConstants.size() > 0)
                {
                    auto it{ std::lower_bound(RegConstants.begin(), RegConstants.end(), RegName) };
                    if (it != RegConstants.end());
                    {
                        int i = std::distance(RegConstants.begin(), it);
                        {
                            std::cout << *(it - FromRegToNameOfVarInRegConstants) << *(it - FromRegToDependencyInRegConstantsAndToCounter)
                                << "(" << RegName << ")" << SaveAndUnSaveChooser(instruction, Language_Letters) << "[" << *(it + FromRegToDependencyInRegConstantsAndToCounter)
                                << "," << Language_Letters.InstructionPointer << boost::lexical_cast<std::string>(ImmConstantCounter) << "]" << " = " << std::hex << RegisterValue << std::endl;
 
 
                            RegConstants.insert(it + FromRegToDependencyInRegConstantsAndToCounter, std::string(RegConstants[i + FromRegToDependencyInRegConstantsAndToCounter] + "," + 
                                Language_Letters.InstructionPointer + boost::lexical_cast<std::string>(ImmConstantCounter)));
                        }
                    }
                }
            }
Щя тогда во всём коде сменю на такую итерацию векторов, спасибо!
0
фрилансер
 Аватар для Алексей1153
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
15.02.2023, 20:01
Цитата Сообщение от OSPFv3 Посмотреть сообщение
сменю
заодно необходимо проверить на невыход за край. Вот тут это не есть очевидно:

Цитата Сообщение от OSPFv3 Посмотреть сообщение
it - FromRegToNameOfVarInRegConstants
Цитата Сообщение от OSPFv3 Посмотреть сообщение
it - FromRegToDependencyInRegConstantsAndToCo unter
Цитата Сообщение от OSPFv3 Посмотреть сообщение
RegConstants[i + FromRegToDependencyInRegConstantsAndToCo unter]
а в последнем почему-то всё равно индекс остался

и
Цитата Сообщение от OSPFv3 Посмотреть сообщение
int i = std::distance(RegConstants.begin(), it);
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 20:04  [ТС]
а в последнем почему-то всё равно индекс остался
Это да, я там не поменял, я понял, что работает, сейчас начну смену моего говнокода, на нормальный...

заодно необходимо проверить на невыход за край.
Типа такого?:
C++
1
if(it <= RegConstants.end())
или там тоже как-то по-другому?
0
фрилансер
 Аватар для Алексей1153
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
15.02.2023, 20:07
OSPFv3, когда отнимаешь(прибавляешь) от итератора (а ранее это делалось с индексами, то есть, проблема уже существовала) , то запросто можно выйти как левее, так и правее за край контейнера. А этого нельзя допускать. Почему нет таких проверок? Чем это гарантируется сейчас ?
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 20:12  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
OSPFv3, когда отнимаешь(прибавляешь) от итератора (а ранее это делалось с индексами, то есть, проблема уже существовала) , то запросто можно выйти как левее, так и правее за край контейнера. А этого нельзя допускать. Почему нет таких проверок? Чем это гарантируется сейчас ?
Как бы так сказать... В случае с ASM и
Assembler
1
Shablon_Inst_CF_1 byte 256 dup (0)
, итератор хранится в RCX или ECX(и итерируемся от большего, т.е. с большего до меньшего, т.е. до нуля) тем самым сбитие там может произойти только из-за меня(когда я заношу максимальное число неправильное(а выход тогда, когда cmp rcx, NULL) и я ничего там и не проверял никогда... как я могу проверять это в С++? кроме моего варианта выше?
0
фрилансер
 Аватар для Алексей1153
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
15.02.2023, 20:23
OSPFv3, тогда индекс действительно придётся находить. И проверять можно будет так:

C++
1
2
3
4
if(i>=X)
{
    .... *(it-X) ....
}
C++
1
2
3
4
if(i+X<RegConstants.size())
{
    .... *(it+X) ....
}
Добавлено через 2 минуты
если, однако, есть уверенность в этом всегда, то можно в релиз не тащить проверку

C++
1
2
3
4
5
assert(i>=X);
 
{
    .... *(it-X) ....
}
C++
1
2
3
4
5
assert(i+X<RegConstants.size());
 
{
    .... *(it+X) ....
}
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 20:29  [ТС]
Алексей1153,
Спасибо! Сейчас тоже добавлю!
0
фрилансер
 Аватар для Алексей1153
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
15.02.2023, 20:49
ещё уточнение. Тип индекса не int
Цитата Сообщение от OSPFv3 Посмотреть сообщение
int auto i = std::distance(RegConstants.begin(), it);
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 20:55  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ещё уточнение. Тип индекса не int
да, спасибо! Сейчас глянул тоже там какой-то std::_Iter_diff_t от этого вектора равный указателю на diff_t, дичь какая-то...
Странно, что всё работало
1
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,261
15.02.2023, 21:32
Да ну... На хрен....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2023, 21:32

Сравнение введеной строки с строкой из файла
Добрый вечер.Пользователь вводит в консоль строку,если это строка уже имеется в файле (открыт заранее),то вывести сообщение.Иначе сохранить...

Сравнение строки со структуры со строкой, введённой пользователей
Есть структура persons, элементы которой заданы статически. Нужно сравнить один элемент структуры( строку char address ) со строкой,...

Описать функцию работы со строкой символов
Описать функцию работы сос строкой символов, которая проверит, начинается ли каждое слово с большой буквы.

Введите строкой набор символов без разделителей
3. Введите строкой набор символов без разделителей (пробел). Подсчитайте и выведите на консоль количество используемых символов и частоту...

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru