Каковы причины решений за реализацию строк в виде массива символов с нулевым маркером по сравнению с другими подходами в C? - PullRequest
1 голос
/ 18 марта 2019

Посмотрев на C в первый раз, я обнаружил, что строка на самом деле является char[] - и мне было интересно, сколько существует различных способов реализации строкового типа данных в результате?

Комментарий к этому вопросу ( Почему для строки из N символов требуется инициализация массива из N + 1 символов в C? )

Для строкового типа данных вам нужно знать длину. Вы можете иметь структуру, которая имеет поле длины (и массив символов), или вам нужен специальный маркер для обозначения конца строки. В C был выбран специальный маркерный метод, и маркер является нулевым символом

Предполагается, что есть только два способа достижения структуры строки?

  1. A char[] с нулевым маркером
  2. Сортировочный объект, который обеспечивает указатель на начало char[] и другие необходимые метаданные

Существуют ли другие способы реализации строкового типа данных? Почему C выбрал подход (1)?

Ответы [ 2 ]

4 голосов
/ 18 марта 2019

Почему C использовал подход (1)?

Согласно Развитие языка C , это было для того, чтобы избежать исправлениямаксимальная длина строки и то, что их личный опыт привел их к мысли, что терминатор более удобен.

Ни один из BCPL, B или C не поддерживает сильно символьные данные в языке;каждая трактует строки как векторы целых чисел и дополняет общие правила несколькими соглашениями.И в BCPL, и в B строковый литерал обозначает адрес статической области, инициализированной символами строки, упакованными в ячейки.В BCPL первый упакованный байт содержит количество символов в строке;в B счетчик отсутствует, а строки завершаются специальным символом, который B пишется *e.Это изменение было сделано частично, чтобы избежать ограничения длины строки, вызванного удержанием счетчика в 8- или 9-разрядном слоте, и частично потому, что, по нашему опыту, поддержание счетчика казалось менее удобным, чем использование терминатора.

Существуют ли другие способы реализации типа данных строки?

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

1 голос
/ 18 марта 2019

Помните, что C был разработан в первую очередь для реализации операционной системы UNIX - обработка текста не собиралась быть в фокусе.

Отображение строк и строковых операций в массивах имеет смысл, поскольку по своей сути строки представляют собой последовательности символьных значений. Существующие операции над массивами (такими, какие они есть) могут быть применены к строкам довольно легко. Некоторые операции, такие как конкатенация, становятся чрезвычайно простыми.

Использование терминатора вместо начального байта длины означает отсутствие верхнего предела длины строки.

Бывают случаи, когда было бы неплохо иметь настоящий строковый тип данных, отличный от массива char. Тем не менее, в большинстве случаев программирования на C этого времени достаточно мало, и достаточно далеко между тем, что этот метод достаточно хорош.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...