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

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

14.02.2023, 21:40. Показов 1685. Ответов 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
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,235
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
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,235
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
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,235
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
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,235
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
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,235
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
Заблокирован
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
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru