Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83

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

14.02.2023, 21:40. Показов 1852. Ответов 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
6510 / 5771 / 1135
Регистрация: 11.10.2019
Сообщений: 15,415
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
6510 / 5771 / 1135
Регистрация: 11.10.2019
Сообщений: 15,415
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
6510 / 5771 / 1135
Регистрация: 11.10.2019
Сообщений: 15,415
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
6510 / 5771 / 1135
Регистрация: 11.10.2019
Сообщений: 15,415
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
6510 / 5771 / 1135
Регистрация: 11.10.2019
Сообщений: 15,415
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
640 / 398 / 68
Регистрация: 09.03.2016
Сообщений: 4,388
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
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru