THIS SECTION IS UNDER CONSTRUCTION
Строки (по хранимым символам) / | \ 8 bit Multibyte 16-bit ANSI UNICODE Имейте в виду что строки могут быть в различных форматах: 8-bit Multibyte (UTF-8 это тоже пример мультибайт) 16-bit Unicode В форматах с фиксированным размером символа проблем не возникает. В форматах с переменным размером символа - для всех операций надо учитывать что символ может занимать разный размер в памяти.
Строки (по способу организации хранения) / | \ Asciiz Pascal прочие Unicodez (короче 0-ended) ASCIIZ-строки
+---+---+---+---+---+---+---+ |'S'|'T'|'R'|'I'|'N'|'G'| 0 | +---+---+---+---+---+---+---+ Строка заканчивается символом с кодом 0. Pacal-строки
+---+---+---+---+---+---+---+ | 6 |'S'|'T'|'R'|'I'|'N'|'G'| +---+---+---+---+---+---+---+ Первый байт строки содержит ее длинну. Строки фиксированной длинны. Бывают и более страшные структуры. например UNICODE_STRING из Windows NT/2000/XP DDK
typedef struct _UNICODE_STRING { USHORT Length; // Текущая длинна USHORT MaximumLength; // Максимально возможная длинна // для текущего буфера PWSTR Buffer; // Указатель на буфер (ASCIIZ) } UNICODE_STRING *PUNICODE_STRING; +---+---+ | 6 | Length +---+---+ | 8 | MaximumLength +---+---+---+---+ +---+---+---+---+---+---+---+---+ | Buffer o|---->|'S'|'T'|'R'|'I'|'N'|'G'| ? | ? | +---+---+---+---+ +---+---+---+---+---+---+---+---+
Вообще говоря структура наиболее общего вида: POINTER Buffer INTEGER CurrentLength INTEGER AllocatedLength INTEGER Locale LOCK_T Lock для thread safe работы со строкой FLAG LockedBuffer Проблемы Locale + Multibyte Если вы планируете все писать с нуля - закладывайтесь на UTF-8 и пакуйте символы по максимуму. (даже с Unicode - вы уже получите Unicode Endian проблему). Концептуальный RTL для строк
Инициализация строки Создание/удаление строки
Вычисление длинны строки strlen multibyte version в символах в байтах Проверка - является ли строка пустой Вычисление сколько места может занимать строка capacity
Выделение нового количества места под строку Выборка байта из строки по индексу Выборка символа из строки по индексу + выборка последнего символа
Добавление символа к строке в конец в начало в указанное место (вставка)
Удаление символов из строки Очистка строки
Объединение двух строк (Добавление строки к строке) strcat Копирование одной строки в другую с заменой Сравнение двух строк сase-sensitive/case-insensitive strcmp strcmpi с учетом locale Копирование строк strcpy Создание копии строки strdup Выборка фиксированной подстроки левой правой в середине multibyte version Поиск позиции с указанными символами * Поиск позиции где нет указанных символов Поиск фиксированной подстроки в строке начиная с указанного места начиная с Nго совпадения начиная с конца Поиск несовпадающей подстроки * Замена подстроки на другую Upcase Locase Удаление указанного набора символов Удаление первого и последнего символа (Trim) полезно когда токен типа 'xx' Расщепление строки на две с указанного места Конвертация строки в другую строку другово типа другово locale и то и другое вместе Конвертация числа в строку Конвертация строки в число Форматы чисел 123 decimal 012 octal 0x123 hexdecimal 0cdh hexdecimal 011b binary $1c hexdecimal с указанным основанием -12 Конвертация строки в число и обратно для FP чисел в обычном формате в экспотенциальном формате помним что кроме FP еще бывают и fixed point Конвертация для bignums - особенный случай Удобно иметь станартную функцию для hash кода (Java) Форматный вывод в строку Форматный вывод в строку sprintf безопасность - нельзя выходить за пределы строки Thread-безопасные операции со строками Локирование (Запрещение изменять pointer на buffer) Регулярные выражения и строки Соответсвие строки регулярному выражению Поиск подстроки соответсвующей регулярному выражению в строке начиная с указанной позиции Списки строк простые с выделением Вставить символ Вставить строку Вставить столбец TO BE DEFINED LATER TODO: TMemo