Форум программистов, компьютерный форум, киберфорум
Nexi99
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Функции по работе со строками

Запись от Nexi99 размещена 03.06.2021 в 01:04
Обновил(-а) Nexi99 04.06.2021 в 04:27

Некоторые функции описаны по причине того что могут встречаться в моих темах, чтобы не подумали что взял функцию из воздуха ну а также будет возможность проверить исправность работы кода выставленного там, просьба не судите строго.
Макросы для сокращения текста кода смотрите здесь https://www.cyberforum.ru/blog... g7146.html
C++
1
2
char cmd_(char*str,char**comand,char kol=3){char q=-1;//считает символы вставляемой строки
for(char w=-1;++w<kol;){for(char e=-1;(str[++q]=comand[w][++e])!='\0';);--q;}ret++q;}
Функция cmd_ соединяет несколько строк из 2ого массива comand в массив str и получается одна длинная строка. Сама функция по большей степени процедурная, но он возвращает общую длину строки. Пример выложу позже.

Функция для поиска символа в строке, будут разные модификации пока выставляю что есть. Требование библиотека по ссылке выше.
PoiskSimv(char*str,char kol,char sm=0,char sh=0,char simv='\\'). Описание аргументов.
str строка.
kol длина строки, указывайте диапазон если просматривается не вся строка в противном случае может быть выход за пределы массива потому что с++ не контролирует массивы, да и к тому же вы можете поместить несколько строк в одну большую, т.е. контроль строки нужен в любом случае.
sm смещение, если оно у вас есть можете сместить строку на несколько байт.
sh -в какую сторону крутить цикл 0-в низ/1-в верх.
Возвращаемое значение смещение до искомого символа включительно. Максимальная длина строки не может быть больше ter[0]/2-1, т.е. максимального значения char.
Пример использования функции.
C++
1
2
3
4
char*put="C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe";//объявили строку далее
cout<<"в верх"<<(Sh)PoiskSimv(&put[3],66,0,1,'\\')<<en;//если пройдёт 66 будет выход за пределы массива выше объяснял. 
//напишите 62
cout<<"в низ "<<(Sh)PoiskSimv(&put[65],66,0,0,'\\')<<en;
У нас имеется строка (2 строчка по коду), её длина 66 символов без учёта '\0'. У нас поставлена задача найти имя процесса brave.exe. Поиск производится с конца строки. В качестве критерия у нас отсекающий символ, в с++ символ \ записывается как '\\'. Стартовым символом будет e, т.е. функция работает с учётом 0го индекса. Проходим строку до нужного символа. Далее если изменить значение на единицу то можем записать название строки в отдельный буфер.

Функции по сравниванию байт(опциональны по типам). Функции описанные ниже не работают со строками, несмотря на заголовок в блоге, они воспринимают всё как байтовую последовательность.
bool strok1(int kol,char tip,...) bool strok11() int strok2(int kol,char tip,...) int strok22()
Функции похожи выполняют одну и ту же задачу но возвращают разные результаты.
Описание аргументов.
kol размер массива
tip тип массива. Укажите любое значение от 1го до 8и. Если вы используете нестандартные типы: например по 3 5 6 байт, то ваш массив должен быть упакован так. К примеру ваше значение занимает 3 байта, но записано в int, то оно будет воспринято как 4 байтовое, т.е. вы должны правильно упаковать данные.
... 3ий элемент может быть любого типа и должен под собой хранить указатель
Пример использования функцииstrok1.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void slovo(char*uk2,char*uk1){for(char q=-1;(uk2[++q]=uk1[q])!='\0';);}//функция для записи строк в массив
//вызов
char*qw[]={new char[42],"NameWinNameWindNameWindNameWindNa"};
//объявил массив указателей, записал строку во 2ой указатель
slovo(qw[0],"NameWinNameWindNameWindNameWindN1");//составил строку для 1го указателя
cout<<"qw[0] "<<qw[0]<<" qw[1] "<<qw[1]<<en;//проверим на всякий случай
cout<<strok1(17,2,qw[0],qw[1])<<en;//представил массив как 2ух байтовый/в этом случае получим ложь(0)
cout<<"strok22() "<<strok22()<<en;//в этом случае получаем тоже 0
slovo(qw[0],"NameWinNameWindNameWindNameWindNa");//правим строку можно индекс строки тут в принципе одинаковые
cout<<"strok11() "<<strok11()<<en;//получаем результат 1цу
cout<<"strok22() "<<strok22()<<en;//получаем результат 17
slovo(qw[0],"NameWinNameWind9ameWindNameWindN1");//правим строку
cout<<"strok2() "<<strok2(17,2,qw[0],qw[1])<<en;//получаем результат 7
delete qw[0];
Как работают функции и возвращаемые ими значения.
Функции построены на классе поэтому имеют общие модули инициализации. Первые 2 логические.
Если есть искажение и байты не равны то возвращается 0 и происходит выход из обоих функций. Функция strok1 получает аргументы и сохраняет все данные внутри объекта класса. Функция strok11 делает то же самое используя готовые данные, тем самым пропускаются проверки и расчёты. Если байты в массиве меняются то функции реагируют по разному т.е. как и должно быть.
Последние 2 возвращают индекс в котором произошло искажение, если с массивом всё нормально и все байты равны то возвращается kol.
В качестве альтернативы можно использовать memcmp. Эта функция работает в 1.5-3 раза быстрее моих из редка медленнее моей. Я решил изучить инструкции на сайте Майкрософт и нашёл много странностей. Там указано что функция представляет все байты как unsigned char https://docs.microsoft.com/en-... w=msvc-160 (и не редко упоминается что их функция предназначена для работы со строками, видимо пока всё не перекодируют не успокоятся), если бы это было так то её бы скорость упала бы как минимуму в 5 раз ниже моей, т.к. моя функция использует алгоритм ускоритель и будет намного быстрее работать чем unsigned char в стандартных ситуациях.
Далее мне известно что у разработчиков как правило высокий уровень доступа, и скорее всего может банально использоваться флаг системы, который отвечает за то менялся массив или нет а проверку функции memcmp я проводил системно, мои же функции воспринимают все данные как спонтанные, и никакого отношения к строкам не имеют, строки я использовал для удобства. Я открыл целых 4 темы чтобы найти окно, этот геморрой обошёлся мне в 2.5 месяца жизни, код позже выложу, а ещё как и оказалось возникает проблема с получением привилегий запущенного процесса, это же сколько времени нужно угробить чтобы получить банально дескриптор процесса, который был запущен своей же программой, чтобы его закрыть(ладно проехали). Также упоминается что их функция отслеживает время выполнения https://docs.microsoft.com/en-... plications читайте блок Sort Code Points, у меня много тем открыто про работу на стадии компиляции, до конца не разобрался, вполне возможно что может быть повязано на этих штуковинах и их функция не столько времени тратит на проверку поступающих данных в массив сколько на тонну проверок чтобы эта функция могла работать, она может состоять из чёрт знает чего. Если учесть тот факт что в инструкции указано что они проверяют массив как unsigned char а скорость этой проверки ниже моей функции как минимум в 5ть раз то не понятно как она будет работать когда будут постоянно поступать спонтанные данные. Код млей функции мне известен ближе к сердцу, как говориться, также я крайне сомневаюсь что разработчики стали бы гробить 2 недели жизни ради таких функций, скорее всего собиралось это их дело не одним программистом. Я всё же решил использовать свои функции.
Размещено в Строки
Показов 962 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Цитата:
    если бы это было так то её бы скорость упала бы как минимуму в 5 раз ниже моей, т.к. моя функция использует алгоритм ускоритель и будет намного быстрее работать
    Функции стандартной библиотеки компилятор имеет право реализовать не так, как обычные функции, или вообще не как функции.
    Простые стандартные функции strcpy(), memcmp() в неучебные неотладочные компиляторы обычно встроены (intrinsic). Т.е. компилятор вставляет на место вызова функции код, результат работы которого совпадет с результатом вызова библиотечной функции.

    Так, например, gcc для x64 заменил
    C
    1
    2
    3
    4
    
    #include <memory.h>
    int square(int num) {
        return memcmp( "abra","q'adabra", 4);
    }
    на что-то вроде
    C
    1
    2
    3
    
    int square (int num) {
         return _eax |= -1;
    }
    https://godbolt.org/z/h4b6Mx5jY
    Запись от politoto размещена 03.06.2021 в 14:34 politoto вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от politoto Просмотреть комментарий
    Функции стандартной библиотеки компилятор имеет право реализовать не так, как обычные функции, или вообще не как функции.
    Простые стандартные функции strcpy(), memcmp() в неучебные неотладочные компиляторы обычно встроены (intrinsic). Т.е. компилятор вставляет на место вызова функции код, результат работы которого совпадет с результатом вызова библиотечной функции.
    Ну вот я про это и подумал. Возможно функцию strcpy я и перееду а вот memcmp не удалось. Интересно что там за алгоритмы скрываются. Что можно почитать по этому поводу? Я не много урывками видел какие-то записи на форумах, но в целом про это ничего не знаю.
    Запись от Nexi99 размещена 03.06.2021 в 18:55 Nexi99 вне форума
  3. Старый комментарий
    Почитал я про Intrinsic функции, я частично прав там и в правду функция разработчиков заранее может определить где произошло изменение и не тратить время на обработку массива мои же функции рассчитаны на спонтанные данные. так что с точки зрения тактики мозг развит у меня хорошо а вот с точки зрения знаний и доступа конечно нет. Ну знания конечно приходят с опытом а вот доступ со временем могут ограничить в новых ОС и можно бесконечно пытаться ломать это дело.
    Запись от Nexi99 размещена 03.06.2021 в 19:08 Nexi99 вне форума
    Обновил(-а) Nexi99 03.06.2021 в 19:12
  4. Старый комментарий
    Intrinsic функции это функции идея которых составлены людьми а реализация пишется машинами. Т.е. эти инструкции порождают машины а не люди поэтому с ними тягаться невозможно если не знать их назначение. Машины могут подобрать всё: и буфера и типы данных и доступ к данным, вот так вот. Так что в целом все мои выводы описанные выше верны, а функцию memcmp я тестировал системно, компилятор заранее мог знать что там изменена 1 ячейка, потому что если данные поданы спонтанно то без перебора цикла тут не обойтись.
    Запись от Nexi99 размещена 03.06.2021 в 22:03 Nexi99 вне форума
    Обновил(-а) Nexi99 03.06.2021 в 22:09
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.