Страницы

Поиск по вопросам

среда, 5 декабря 2018 г.

Длина строки в чистом C

У меня есть такой прототип функции: int len(const char *string);. Как мне ее реализовать ? Я ведь знаю только адрес первого символа. Могу ли я как-то узнать сколько их всего ?


Ответ

Можете, но только если вызывающий совершенно точно даёт вам именно строку
В Си всякая строка является массивом символов. Но не всякий массив символов можно считать строкой.
На уровне системы типов Си не различает их вовсе. Всё держится на уговоре, что в конце указанной (началом) области памяти точно есть нуль-символ, в противном случае считать её строкой не следует, и работать с ней даже стандартными функциями для строк опасно.
О сишных строках известно, что:
Символы в них идут в памяти подряд по возрастанию указателей. Первый встреченный символ с кодом 0 (нуль-символ) — конец строки. Каждый символ содержится в одном char'е. Это здорово ограничивает множество совместимых кодировок (из известных русскоязычных на ПК: Windows-1251, CP866, KOI8-r), но для учебных задач это часто предполагают. Если строка окажется, например, в UTF-8, функция не упадёт (т. к. нуль там такой же), но результат может дать неверный (если ожидается число символов).
Считать ли завершающий ноль как занимающий длину... есть аргументы в обе стороны.
С одной стороны, этот нуль-символ не входит в "полезную нагрузку" строки, это чисто служебный элемент. Общепринято, так считает strlen С другой, нуль-символ занимает место и его существование нужно учитывать при выделении пространства для хранения.

Комментариев нет:

Отправить комментарий