Обработка строки C


Язык программирования C имеет набор функций, реализующих операции над строками (символьными и байтовыми строками) в своей стандартной библиотеке . Поддерживаются различные операции, такие как копирование, конкатенация , токенизация и поиск. Для символьных строк в стандартной библиотеке используется соглашение о том, что строки заканчиваются нулем : строка из n символов представляется как массив из n + 1 элементов, последним из которых является NULсимвол (с числовым значением 0).

Единственная поддержка строк в самом языке программирования заключается в том, что компилятор переводит строковые константы в кавычках в строки с завершающим нулем.

Строка определяется как непрерывная последовательность единиц кода, заканчивающаяся первой нулевой единицей кода (часто называемой единицей кода NUL ). [1] Это означает, что строка не может содержать нулевую единицу кода, так как первая увиденная единица отмечает конец строки. Длина строки — это количество единиц кода перед нулевой единицей кода. [1] Память, занимаемая строкой, всегда на одну кодовую единицу больше, чем длина, так как место необходимо для хранения нулевого терминатора.

Как правило, термин « строка » означает строку, в которой единица кода имеет тип char, который на всех современных машинах составляет ровно 8 бит. C90 определяет широкие строки [1] , которые используют кодовую единицу типа wchar_t, которая на современных машинах составляет 16 или 32 бита. Это было предназначено для Unicode , но вместо этого все чаще используется UTF-8 в обычных строках для Unicode.

Строки передаются функциям путем передачи указателя на первую единицу кода. Поскольку char*и wchar_t*являются разными типами, функции, обрабатывающие широкие строки, отличаются от функций, обрабатывающих обычные строки, и имеют другие имена.

Строковые литералы ( "text"в исходном коде C) преобразуются в массивы во время компиляции. [2] Результатом является массив кодовых единиц, содержащий все символы плюс конечный нулевой кодовый элемент. В C90 L"text"выдает широкую строку. Строковый литерал может содержать нулевую единицу кода (один из способов — поместить \0в исходный код), но это приведет к тому, что строка закончится в этой точке. Остальная часть литерала будет помещена в память (с добавлением еще одной нулевой единицы кода в конец), но невозможно узнать, что эти единицы кода были переведены из строкового литерала, поэтому такой исходный код не является строковым литералом. [3]