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

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

Запись от Nexi99 размещена 03.06.2021 в 01:04
Показов 4182 Комментарии 4

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

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

Функции по сравниванию байт(опциональны по типам). Данный модуль изначально собирался через класс на данный момент он доработан, но будут и другие изменения. Функции описанные ниже не работают со строками, несмотря на заголовок в блоге, они воспринимают всё как байтовую последовательность. Требования статическая библиотека Nexi99_ ссылка выше, а также вызов и инициализация функции Maks_Znah(будет в архиве вместе с примером кода).
Есть класс ComparisonBytes(переводится Сравнение байт), находится в заголовочном файле klas. Функции.
C++
1
2
bool ComparisonBytLog1(int size,char tip,...) bool ComparisonBytLog2() 
int ComparisonBytInd1(int size,char tip,...) int ComparisonBytInd2()
Функции похожи выполняют одну и ту же задачу но возвращают разные результаты.
Описание аргументов.
size размер массива
tip тип массива. Укажите любое значение от 1го до 8и. Если вы используете нестандартные типы: например по 3 5 6 байт, то ваш массив должен быть упакован так. К примеру ваше значение занимает 3 байта, но записано в int, то оно будет воспринято как 4 байтовое, т.е. вы должны правильно упаковать данные.
... 3ий и 4ый элементы могут быть любого типа и должны под собой хранить указатель.
Пример использования функции смотрите в архиве, файл называется ТестированиеКлассаStroka_lib.

Как работают функции и возвращаемые ими значения.
Функции имеют общие модули инициализации. Первые 2 логические.
Если есть искажение и байты не равны то возвращается 0 и происходит выход из обоих функций. Функция ComparisonBytLog1 получает аргументы и сохраняет все данные внутри объекта класса. Функция ComparisonBytLog2 делает то же самое используя готовые данные, тем самым пропускаются проверки и расчёты. Если байты в массиве меняются то функции реагируют по разному т.е. как и должно быть.
Последние 2 возвращают индекс в котором произошло искажение, если с массивом всё нормально и все байты равны то возвращается size.
В качестве альтернативы можно использовать memcmp. Эта функция работает в 1.5-3 раза быстрее(последняя сборка на Release поэтому результат уже будет лучше т.к. статья уже правится не 1ый раз) моих из редка медленнее моей.
C++
1
void StrokaPoint0();
Ранее я упоминал что используется объект класса чтобы соединить всё части и получить один единый модуль чтобы в конечном итоге питать как функции так и его методы. Если вы хотите сравнить строку в 1ой локальной зоне, то вам нет необходимости создавать объект класса, все 4 указанные функции имеют объект класса(они всегда автоматически будут возвращать результаты последнего объекта к которому вы возвращались, скачаете архив там увидите более подробно как считает) и указатель
C++
1
ComparisonBytes*ComparByte;
который может перенаправлять один объект на другой, доступ к методам происходит через разименовывание указателя. Т.е. если у вас разные строки в 1ой локальной зоне то вы можете делать что-то вроде
C++
1
2
3
4
5
6
7
8
{char*arr[]={"Pomidor","Pomidot"}далее не создавая объект вызываем
ComparisonBytLog1(1,7,arr[0],arr[1]);//я указал что у нас 1 ячейка на 7 байт
//можете вызвать другие функции чтобы найти индекс искажения
//или изменить строку и вызвать ComparisonBytLog2();
//создадим объект
ComparisonBytes str;//у вас появляется 2ой объект указатель центрального 1го объекта направлен на него
//т.е. функция ComparisonBytLog1 будет рассматривать 2ой объект переключается автоматически.
}
Несмотря на то что вы создали 1объект у вас на самом деле 2 объекта. Указатель ComparByte переключён на 2ой объект. Чтобы переключить его на 1ый базовый объект нужно вызвать StrokaPoint0(). Чтобы переключить указатель на другой объект достаточно обратиться к методу класса.
Т.е. как вы уже поняли вам не нужно постоянно использовать методы класса, после создания объекта класса можно использовать уже функции.
Методы класса имеют похожие названия с функциями описывать их нет смысла.
C++
1
int StrPointNew();void StrPointDynamic(int str);void StrPointDelete(int str);
Эти 3 функции предназначены для работы в случаях когда класс создан в dll и вы хотите удалённо им управлять, т.к. экспорт из dll не возможен.
Функция StrPointNew() выделяет память и возвращает целое число и как вы уже догадываетесь вам придётся вручную следить за таким объектом.
Функция StrPointDynamic(StrPointNew()(это будет переменная)) сохранит в базовый указатель ваш созданный объект чтобы обеспечить удалённое управление.
Функция StrPointDelete(StrPointNew()(это будет переменная)) разрушит объект и доступ к участку будет потерян.
Если название методов класса совпадает с названиями функций то их можно использовать, все остальные элементы класса выполняют служебную функцию и не могут быть вызваны для использования.
Размещено в Строки
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 вне форума
  4. Старый комментарий
    Intrinsic функции это функции идея которых составлены людьми а реализация пишется машинами. Т.е. эти инструкции порождают машины а не люди поэтому с ними тягаться невозможно если не знать их назначение. Машины могут подобрать всё: и буфера и типы данных и доступ к данным, вот так вот. Так что в целом все мои выводы описанные выше верны, а функцию memcmp я тестировал системно, компилятор заранее мог знать что там изменена 1 ячейка, потому что если данные поданы спонтанно то без перебора цикла тут не обойтись.
    Запись от Nexi99 размещена 03.06.2021 в 22:03 Nexi99 вне форума
 
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru