Почему не делает оконечных строк C со специальным завершенным символом строкового завершения?

Я прибавляю вопрос Nick's: когда жесткие ссылки полезны или необходимы? Единственное приложение, которое появляется по моему мнению, в котором символьные ссылки не сделали бы задания, предоставляет копию системного файла в chrooted среде.

17
задан akway 19 July 2009 в 23:01
поделиться

6 ответов

Завершение с 0 имеет много тонкостей производительности, которые были очень актуальны еще в конце 60-х.

ЦП имеют инструкции для условного перехода при тестировании на 0. Фактически, некоторые ЦП даже есть инструкции, которые будут перебирать / копировать последовательность байтов до 0.

Если вместо этого вы использовали экранированный символ, у вас есть два тестовых ДВА разных байта для подтверждения конца строки. Мало того, что это медленнее, но и вы теряете возможность итерации по одному байту за раз, так как вам нужен упреждающий просмотр или возможность возврата.

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

Во-первых, размер строки ограничен количеством байтов, которое занимает счетчик. Один байт дает вам 255 символов, два байта дают вам 65535 и т. Д. Сегодня это может быть почти неактуальным, но когда-то добавление двух байтов к каждой строке было довольно дорого.

Изменить:

Я не думаю, что вопрос глупый . В наши дни языков высокого уровня с управлением памятью, невероятной мощностью процессора и неприличным объемом памяти такие решения из прошлого вполне могут показаться бессмысленными. И действительно, они МОГУТ быть сегодня бессмысленными, так что расспросить их - это нормально.

В наши дни языков высокого уровня с управлением памятью, невероятной мощностью процессора и неприличным объемом памяти такие решения из прошлого вполне могут показаться бессмысленными. И, действительно, в наши дни они МОГУТ быть бессмысленными, так что расспросить их - это нормально.

В наши дни языков высокого уровня с управлением памятью, невероятной мощностью процессора и неприличным объемом памяти такие решения из прошлого вполне могут показаться бессмысленными. И, действительно, в наши дни они МОГУТ быть бессмысленными, так что расспросить их - это нормально.

39
ответ дан 30 November 2019 в 10:29
поделиться

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

Если вы использовали \ $ для завершения строк, какое значение байта будет у него в памяти? Как бы вы включили это байтовое значение в строку?

Вы столкнетесь с этой проблемой, что бы вы ни делали, если вы используете специальный символ для завершения строки. Альтернативой является использование подсчитанных строк , при этом представление строки включает ее длину (например, BSTR ).

13
ответ дан 30 November 2019 в 10:29
поделиться

Я полагаю, потому что это быстрее проверять и совершенно невероятно, чтобы встретиться в разумной строке. Также помните, что C не имеет понятия строк. Строка в C - это не что-то само по себе. Это просто набор символов. Тот факт, что он называется и используется как струна, является чисто случайным и условным.

2
ответ дан 30 November 2019 в 10:29
поделиться

Это вызывает проблемы, но вы можете встроить \ 0 ...

const char* hello = "Hello\0World\0\0";

Это вызовет проблему, если вы передадите это стандартной библиотечной функции, такой как strlen , но не в противном случае.

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

const char* hello = "\x0BHello World";

... как это делают некоторые другие языки.

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

Нет причин, по которым нулевой символ может быть частью строки, кроме как терминатор; у него нет графического представления, поэтому вы его не увидите, и он не действует как управляющий символ. Что касается текста, это настолько внеполосное значение, которое вы можете получить без использования другого представления (например, многобайтового значения, такого как 0xFFFF).

Если немного перефразировать вопрос Майкла, как вы ожидаете, что «Hello \ 0World \ 0» будет обработан?

-1
ответ дан 30 November 2019 в 10:29
поделиться

Если стандартные библиотечные функции, такие как strlen или printf, могут (по желанию) искать маркер конца строки \ 777 (в качестве альтернативы \ 000), у вас может быть постоянный символ строка, содержащая \ 0s:

const char* hello = "Hello\0World\0\0\777"; 
printf("%s\n", hello); 

Между прочим, если вы хотите отправить \ 0 на стандартный вывод (он же -print0), вы можете использовать:

putchar(0); 
0
ответ дан 30 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

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