Определение строки без нулевого завершающего символа (\ 0) в конце
==================================================================

Какие существуют способы в C / C ++ для определения строки без завершающего нулевого символа char (\ 0) в конце?

**РЕДАКТИРОВАТЬ:** Меня интересуют только массивы символов, а не строка STL.

Типично, как написал другой постер:

или если ваша текущая кодировка C является ASCII, что обычно верно (не так много EBCDIC сегодня)

Существует также в значительной степени игнорируемый способ, который работает только в C (не C ++)

Если размер массива слишком мал, чтобы удерживать окончательный 0 (но достаточно велик, чтобы вмещать все остальные символы константной строки), конечный ноль не будет скопирован, но он все равно действителен C (но недействителен C ++).

Очевидно, вы также можете сделать это во время выполнения:

или (то же самое замечание о кодировке ASCII, что и выше)

Или используя memcopy (или memmove, или bcopy, но в этом случае это не выгодно).

или strncpy

Следует понимать, что в C нет такого понятия, как строка (в C ++ есть объекты строк, но это совсем другая история). Так называемые строки - это просто массивы символов. И даже имя символа вводит в заблуждение, это не символ, а просто числовой тип. Возможно, мы могли бы вместо этого назвать его байтом, но в старые времена было странное оборудование, использующее 9-битные регистры или около того, и байт подразумевал 8-битные.

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

Я имею в виду (например), что вам не нужно делать

Чтобы сохранить код 0 в символе, просто выполните:

Поскольку нам очень часто приходится работать с кучей символов переменной длины, дизайнеры C также выбрали соглашение для «строк». Просто поместите код 0, где текст должен заканчиваться. Кстати, для этого вида строкового представления есть имя «строка с нулевым символом в конце», и если вы видите две буквы sz в начале имени переменной, это обычно означает, что ее содержимое является строкой с нулевым символом в конце.

«C sz strings» вообще не является типом, это просто массив символов, как обычно, как, скажем, массив int, но функции управления строками (strcmp, strcpy, strcat, printf и многие другие) понимают и используют 0 окончание конвенции. Это также означает, что если у вас есть массив символов, не оканчивающийся нулем, вы не должны вызывать ни одну из этих функций, так как это, вероятно, будет делать что-то не так (или вы должны быть очень осторожны и использовать функции сn письмо в их названии, какstrncpy).

Самая большая проблема с этим соглашением состоит в том, что есть много случаев, когда это неэффективно. Один типичный пример: вы хотите поместить что-то в конец строки с нулем. Если вы сохранили размер, который вы можете просто перепрыгнуть в конце строки, с помощью соглашения sz, вы должны проверить его символ за символом. Другие виды проблем возникают при работе с закодированным Unicode или тому подобное. Но в то время, когда был создан C, это соглашение было очень простым и отлично справлялось с работой.

В настоящее время буквы между двойными кавычками, такими как «строка», не являются простыми символами, как в прошлом, но`const char *`, Это означает, что указатель указывает на константу, которая не должна изменяться (если вы хотите изменить ее, вы должны сначала скопировать ее), и это хорошо, потому что это помогает обнаруживать много ошибок программирования во время компиляции.



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



Завершающий ноль существует для завершения строки. Без этого вам нужен какой-то другой метод для определения его длины.

Вы можете использовать предопределенную длину:

Вы можете эмулировать строки в стиле паскаля:

Ты можешь использовать`std::string` (в C ++). (поскольку вы не заинтересованы в std :: string).

Желательно, чтобы вы использовали какую-то уже существующую технологию, которая обрабатывает юникод или, по крайней мере, понимает кодирование строк (т.е.`wchar.h`).

И комментарий: если вы помещаете это в программу, предназначенную для запуска на реальном компьютере, вы можете подумать об определении собственной строки. Это побудит ваш компилятор прекратить, если вы случайно попытаетесь передать его в функцию, ожидающую строку в стиле C.



[строка](http://www.cplusplus.com/reference/string/string/) класс и не иметь дело с нулевым символом вообще.



 что обработчик строки может определить ее длину. Если вы не используете NULL-завершение, вам нужно передать длину строки либо через отдельный параметр / переменную, либо как часть строки. В противном случае вы можете использовать другой разделитель, если он не используется внутри самой строки.

Если честно, я не совсем понимаю ваш вопрос, или, если это действительно вопрос.



`std::string`S не NUL прекращается.

П.С .:`NULL` это макрос1. `NUL` является`\0`, Не путай их.

1: C.2.2.3 Макрос NULL

Макрос NULL, определенный в любом из`<clocale>`, `<cstddef>`, `<cstdio>`, `<cstdlib>`, `<cstring>`, `<ctime>`, или же`<cwchar>`, является определенной в реализации постоянной нулевого указателя в этом международном стандарте (18.1).



 как правило, не будет более простого решения. Вы могли бы сделать то же, что сделал Паскаль, и поместить длину строки в первый символ, но это немного болезненно и ограничит длину вашей строки размером целого числа, которое может поместиться в пространство первого символа. ++ я бы определенно использовал класс std :: string, к которому можно получить доступ

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



`vector<char>`



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

Лично я не могу придумать какой-либо реалистичный сценарий того, почему вы хотите это сделать, поскольку нулевой символ означает конец строки. Если вы тоже храните длину строки, то, я думаю, вы сохранили один байт за счет того, какой размер вашей переменной равен (вероятно, 4 байта), и получили более быстрый доступ к длине указанной строки.