Является ли объект строкового типа в C ++ массивом символов, подобным объекту C-строки? - PullRequest
0 голосов
/ 07 октября 2018

Итак, я знаю, что все C-строки являются массивами символов в C ++.А как насчет строк?

Кроме того, почему char x[] = {'H', 'i'}; НЕ является C-строкой?x - это массив символов, что означает, что это C-строка.Я что-то упустил?

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Как упоминалось в предыдущих ответах char x [] = {'H', 'i'};не является допустимой строкой C, так как отсутствует нулевой символ для обозначения окончания или конца строки.Стандартный шаблон C ++ предоставляет класс String, который гарантирует динамическое непрерывное выделение памяти (аналогично Vector) и легкий доступ по индексу.больше об этом можно найти в https://en.cppreference.com/w/cpp/string/basic_string.

0 голосов
/ 07 октября 2018

C ++ предлагает стандартную форму библиотеки, в которой определено class string.Class String - это не просто строка символов C (char* C или char sz []).Строка класса имеет методы и атрибуты, а последняя нет.Также строка класса ее размер меняет время выполнения, а последний нет.Он также управляет памятью для вас в своих Ctor и Dtor.В качестве совета используйте как можно больше Строка класса, а не char *.

  • Строка класса добавляет символ NULL \0 в конце строки как знак конца строки, в то время какпоследний №
0 голосов
/ 08 октября 2018

Я нашел хорошее объяснение вашего вопроса здесь: Строки C и C ++ .Вкратце:

Строка AC обычно объявляется как массив char.Однако массив char сам по себе НЕ является строкой C.Допустимая строка C требует наличия завершающего «нулевого символа» (символ со значением ASCII 0, обычно представляемый символьным литералом '\ 0').

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

Представления в памяти:

C-String C-String

C ++ строка C++ string

Обновлено:

Вы должны понимать, что:

  1. C ++ предлагает больше типов символов, чем char в C, например, UTF-16 и UTF-32.

  2. C ++ определяет вещь под названием std::basic_string, которая является шаблоном класса длясоздание строк из этих типов символов.

  3. C ++ typedef шаблон класса для типа char как std::string.

СейчасВы знаете, что std::string - это basic_string для char -типированных символов.Ссылаясь на Нужно ли std :: string хранить свой символ в непрерывном фрагменте памяти? , если вы упоминаете std::string, то для C++ 11 и более поздних версий это по сути массив AN (не TWO)или БОЛЬШЕ массивов) из char символов.Для C++ версий, предшествующих C++ 11 или для некоторых других типов символов (на самом деле я не уверен), базовая память может быть не смежной (т. Е. Для хранения строки может потребоваться ДВА или БОЛЬШЕ массивов (не AN-массив))).

0 голосов
/ 07 октября 2018

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

C строкаэто массив символов char * или char []

Но что касается строк C ++, это класс, который имеет много операций (методов), которые могут произойти с ним, имеет длину и проверяет длину (например, C ++ vector и array), когда вы пытаетесь получить доступ к нижнему индексу массива (используя метод at).Его копирование может быть более производительным, поскольку известна длина для выделения новой области памяти.

Вы можете создать std::string из строки C.Существует конструктор, который берет строку C и длину и создает из них std :: string.

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

...