Почему делают строки в C должны быть пустые завершенный?

Просто удивление, почему дело обстоит так. Я стремлюсь знать больше о низкоуровневых языках, и я только в основы C, и это уже смущает меня.

Языкам нравится PHP автоматически пустые оконечные строки, поскольку они интерпретируются и / или анализируются?

20
задан alex 26 May 2013 в 23:50
поделиться

8 ответов

Из отличной статьи Джоэла по этой теме:

Вспомните, как строки работают в C: они состоят из группы байтов, за которыми следует нулевой символ, который имеет значение 0. Это имеет два очевидных следствия:

Невозможно узнать, где заканчивается строка (то есть длину строки), не перемещаясь по ней и не ища нулевой символ в конце. В вашей строке не может быть нулей. Таким образом, вы не можете хранить произвольный двоичный объект, такой как изображение JPEG, в строке C. Почему строки C работают таким образом? Это потому, что микропроцессор PDP-7, на котором были изобретены UNIX и язык программирования C, имел строковый тип ASCIZ. ASCIZ означало «ASCII с Z (нулем) в конце».

Это единственный способ хранить строки? Нет, на самом деле, это один из худших способов хранения строк. Для нетривиальных программ, API, операционных систем, библиотек классов вам следует избегать строк ASCIZ как чумы.

28
ответ дан 29 November 2019 в 23:14
поделиться

Они должны иметь нулевое завершение, чтобы вы знали, сколько они длились. И да, это просто массивы символов.

Языки более высокого уровня, такие как PHP, могут скрывать от вас нулевое завершение или вообще не использовать его - например, они могут поддерживать длину. C не делает этого из-за накладных расходов. Языки высокого уровня также могут не реализовывать строки как массив символов - они могут (и некоторые реализуют) их, например, как списки массивов символов.

1
ответ дан 29 November 2019 в 23:14
поделиться

Сам по себе C не имеет понятия о строках. Строки - это просто массивы символов (или wchars для юникода и т.п.).

Из-за этих фактов C не имеет возможности проверить то есть длину строки, так как нет «mystring-> length», и где-то не задано значение длины. Единственный способ найти конец строки - перебрать его и проверить наличие \ 0.

Существуют строковые библиотеки для C, которые используют такие структуры, как

struct string {
    int length;
    char *data;
};

, чтобы устранить необходимость в \ 0-завершении, но это не стандарт C.

Такие языки, как C ++, PHP, Perl и т. Д., Имеют свои собственные внутренние строковые библиотеки, которые часто имеют отдельное поле длины, которое ускоряет некоторые строковые функции и устраняет необходимость в \ 0.

Некоторые другие языки (например, Паскаль) используют строковый тип, который называется (что удивительно) строкой Паскаля, он хранит длину в первом байте строки, что является причиной того, что длина этих строк ограничена 255 символами.

5
ответ дан 29 November 2019 в 23:14
поделиться

Вы можете посмотреть на программу sage , которая представляет собой повторную реализацию интерпретатора python, позволяющую вызывать различные языки программирования для статистики (R, matlab, octave и т. д.) с помощью синтаксиса python.

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

Итак, помимо выбора языка программирования (я думаю, что другие люди уже ответили на ваш вопрос), вам также нужен синтаксис для определения конвейеров скриптов: вы можете сделать его с помощью программы 'gnu/make' (например, читать это ) или с помощью этого sage , или есть другие решения.

-121--2066717-

jBPM (по крайней мере, v3) имеет хорошую реализацию бизнес-календаря .

Если вы не хотите всю зависимость от JBPM, я думаю, что вы можете извлечь только календарный пакет

-121--1286454-

Это соглашение - можно было бы реализовать его с помощью другого алгоритма (например, длина в начале буфера).

В языке «низкого уровня», таком как ассемблер, легко эффективно протестировать на «NULL»: это могло бы облегчить решение о переходе с завершенным NULL последовательностей в отличие от сохранения трека счетчика длины.

1
ответ дан 29 November 2019 в 23:14
поделиться

Строки C - это массивы символов, а массив C - это просто указатель на ячейку памяти, которая является начальной ячейкой массива. Но также должна быть как-то выражена длина (или конец) массива; в случае строк используется нулевое завершение. Другой альтернативой было бы как-то переносить длину строки вместе с указателем памяти или помещать длину в первое место массива или что-то еще. Это просто вопрос условности.

Языки более высокого уровня, такие как Java или PHP, автоматически и прозрачно хранят информацию о размере с массивом, поэтому пользователю не нужно беспокоиться о них.

7
ответ дан 29 November 2019 в 23:14
поделиться

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

В таких языках, как PHP, Perl, C # и т. Д. Строки могут иметь или не иметь сложные структуры данных, поэтому вы не можете предполагать, что они содержат нулевой символ. В качестве надуманного примера у вас может быть язык, который представляет такую ​​строку:

class string
{
   int length;
   char[] data;
}

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

1
ответ дан 29 November 2019 в 23:14
поделиться

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

0
ответ дан 29 November 2019 в 23:14
поделиться

Потому что в C строки - это просто последовательность символов, доступ к которой осуществляется через указатель на первый символ.

В указателе нет места для хранения длины, поэтому вам нужно указать, где находится конец строки.

В C было решено, что это будет обозначаться нулевым символом.

В паскале, например, длина строки записывается в байте, непосредственно предшествующем указателю, поэтому строки паскаля имеют максимальную длину 255 символов.

4
ответ дан 29 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: