Существует различие между физическим, сохраненным представлением строки стиля C и логическим представлением строки стиля C.
Физическое представление того, как строка фактически хранится в памяти или других носителях, включаетнулевой символ. Нулевой символ включается при обсуждении физического представления, поскольку он занимает дополнительную часть памяти. Для того чтобы быть строкой в стиле C, нулевой символ должен быть сохранен.
Однако логическое представление строки не включает нулевой символ. Логическое представление строки включает в себя только текстовые символы, которыми программист хочет манипулировать.
Я подозреваю, что нулевой символ, значение двоичного нуля, был выбран из-за того, что исходный набор символов ASCII определил символзначение ноль в качестве символа NULL. Часть более низких значений среди различных управляющих кодов телетайпа, кажется, наименее вероятный символ ASCII, который может появиться в тексте. См. Коды символов ASCII .
Еще одним хорошим качеством использования двоичного нуля в качестве ограничителя строки является то, что это значение представляет логическое ложное значение, поэтому итерация по строке часто является вопросом увеличенияиндекс массива или увеличение указателя при логическом значении true, поскольку все символы, кроме индикатора конца строки, имеют ненулевое или логическое значение true.
Из-за того, насколько близко аппаратное обеспечение к языку программирования C,программист должен заботиться об обоих представлениях, физическом представлении при выделении памяти для хранения строки, которая содержит нулевой символ, и логическом представлении, которое является строкой без нулевого символа.
Различные функции манипуляции со строками в стиле Cв стандартной библиотеке (strlen()
, strcpy()
и т. д.) все разработано вокруг логического представления строки стиля C. Они выполняют свои действия, используя нулевой символ как не являющийся частью текста, а скорее как специальный индикаторный символ, который указывает конец строки. Однако, как часть их операций, они должны знать о нулевом символе и его использовании в качестве специального символа. Например, когда strcpy()
или strcat()
используются для копирования строк, они также должны копировать нулевой символ, указывающий конец строки, даже если он не является частью фактического текста логического представления.
Этот выбор позволяет текстовым строкам храниться в виде массивов символов, что соответствует аппаратной ориентации и характеристикам эффективности языка C. Нет необходимости создавать дополнительный встроенный тип для текстовых строк, и он хорошо согласуется со скудным символом Cязык программирования.
C ++ может предоставить std::string
благодаря своей объектно-ориентированной поддержке и наличию дополнительных возможностей языка, позволяющих создавать и управлять объектами. В языке программирования C из-за его простого синтаксиса и отсутствия объектно-ориентированных возможностей это удобство отсутствует.
Проблема этого подхода заключается в том, что программист должен знать как физическое представление, так и логическое представление. текстовых строк и быть в состоянии удовлетворить потребности обоих при написании программ.