В последние пару дней я учил себя с ++, чтобы подготовиться к первокурсному обучению по специальности CS. Я сейчас в строках в стиле C, и мне интересно, в чем смысл нулевого терминатора.
Я понимаю, что это необходимо, но, думаю, я просто не понимаю, почему строка не заканчивается только на последнем символе.
Я просто не понимаю, почему строка не заканчивается на последнем символе.
Есть несколько способов узнать, где находится «последний символ»:
С выбрать второй маршрут; другие языки (Паскаль и т. д.) выбирают первый маршрут. Некоторые реализации C ++ std::string
выберите третий маршрут* .
* Четное std::string
реализации, которые используют первый или третий подход, заканчивают свои буферы нулевым завершением для совместимости с частями C библиотеки. Это необходимо для того, чтобы c_str()
возвращает допустимую строку C.
В C и C ++ c-строки хранятся в массиве символов. Чтобы разрешить строки различной длины, эти массивы часто выделяются намного больше, чем фактические строки, которые они должны содержать. Например, программист может выделить char[256]
массив, который может содержать строку длиной от 0 до 255 символов. Но компьютер должен точно знать, какой длины строка на самом деле, поэтому он должен заканчиваться нулевым символом. В противном случае было бы необходимо, чтобы длина символьного массива была точно такой же, как и у строки (непрактичное решение, так как при распределении и копировании памяти используется много ресурсов).
Потому что строка в стиле c не знает, какой символ является последним. Например, если вы читаете имя, вы можете создать буфер следующим образом:
char buf[256] // this allows c-style strings that contain 255 characters
Но когда вы заполняете этот буфер, вы не можете (скорее всего, не) использовать все пространство. Если вы заполните его «Джек», единственная информация, которая вас волнует, это первые пять индексов, а не все 256.
Рассмотрим каждый символ строки как блоки памяти в памяти.
Если строка помещена в память. После этого рядом с ним помещается еще одна строка, и компьютер будет считать, что вторая строка соединена с первой, если отсутствует ноль. Итак, null действует как разделитель