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

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

14.02.2023, 21:40. Показов 1496. Ответов 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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
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
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,921
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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru