Строки и их использование

240
11 января 2018, 22:53

Как лучше всего объявить строку и работать с ней:

string name, char* name или char name[10], например

Answer 1

Если коротко, то по-моему в большенстве случаев лучше использовать std::string, далее подробнее:

У массива символов есть определенные недостатки:

  • Необходимо самостоятельно следить за выходом за границу массива
  • При динамическом размещении строки в куче (при использовании new char[]) необходимо всегда помнить о необходимости освободить память
  • При размещении в стеке (типа char s[100]) строка всегда будет занимать в память 100 байт, даже если хранимая строка будет длинной 10 байт
  • Определение длинны строки состоит в переборе символов до обнаруженмя '\0'

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

Кроме того хочется добавить про отличие char[] и char*: при объявлении строки

char array_string[] = "string";

в стеке будет создан массив символов, в который из строкового литерала (хранящегося, кстати, где-то совершенно в другом месте) будет скопирована строка "string". Вы можете писать в этот массив, изменять его содержимое.

Однако при объявлении

char *pointer_string = "string";

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

Кроме того банальная sizeof(array_string) вернет Вам количество символов в строке, когда как sizeof(pointer_string) вернет размер указателя.

Answer 2
string name; 

Лучший выбор.

char *name1;

Для С но можно и в С++. Я бы вообще не советовал опасная вещь.

char name2[N];

Хороший вариант для strcpy_s и прочего(но смысл если в string всё это есть)

string s1,s2;
s1="HELLO";
s2="WORLD";
cout<< s1+" "+s2<<endl;
s1=s2+"!";
if(s1==s2)
    cout<<"error"<<endl;
READ ALSO
Нарушение доступа для записи | C++

Нарушение доступа для записи | C++

Прошу помощи в решении данной проблемы

235
Оптимизация записи в файл

Оптимизация записи в файл

Нужно максимально оптимизировать файловый выводНачал с обычной очереди сообщений и записи в отдельном потоке с предварительным форматированием

234
Быстрая сортировка C++ (qsort)

Быстрая сортировка C++ (qsort)

По ходу изучения предмета Алгоритмы и структуры данных, знакомлюсь с разными алгоритмами сортировки, конкретно с quick sort на данном этапе, задался...

264