Массив для работы с символьными строками. Копаем глубоко

Как массив строк можно использовать vector<string>, но в этой статье более низкоуровневые коды.
  • Используются: массив символьных строк, массив указателей и указатель на указатель.
Каждую из этих трёх сущностей можно выдавать за массив строк и работать с ними как с обычным массивом.
Массив строк — это в самом примитивном случае двумерный массив символов. Поскольку строки сами по себе одномерные символьные массивы, то получится, что массив строк — это массив символьных массивов. Массив массивов — это и есть двумерный массив.

Для массива в квадратных скобках указываете сколько массивов, т. е. строк всего надо хранить. Во вторых скобках указываете максимальную длину строки. При работе с {массивом указателей на символы} как с {массивом строк} для всех строк длина будет одинаковой, ибо массивы хранят однотипные элементы. Дальше происходит обычный обход массива со считыванием значений посредством клавиатуры и обход для вывода введённых в массив строк строк.
Чуть более сложным для освоения являетcя массив указателей:

Для освоения этого примера требуется немного понимать указатели и немного понимать массивы. Указатели схожи с массивами. Показанный листинг хорош тем, что можно задавать количество строк в ходе работы программы, чего нельзя сделать, используя обычный двухмерный массив:
  • В показываемом ниже примере всё, что не будет вмещаться в строку, проигнорируется.
При работе программы нужно будет задавать длину для каждой вновь вводимой строки и количество символов для той строки. Каждая строка будет создаваться с указанной для неё длиной. Некоторые подробности я объяснить не смогу, не смогу рассказать про момент с вводом, где ипользуется cin.clear(), не смогу, потому что это мне помогли сделать, а я сам не знаю пока что, что происходит, и объяснить правильным образом, легко и понятно тот кусочек пока что не в моих силах.

Число 9999 — это некоторое число, которое обозначит максимально возможную длину строки в принципе. В современных компиляторах (поставляемых после 2011г.) этот же код лучше писать так:

Ещё один вариант работы с массивом строк — это создание указателя на указатель, указывающего на символьный массив.

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

Если вспомнить об ограничении массивов, что нельзя задавать количество элементов, умещающихся в массив, в ходе работы программы, то несложно понять, что указатель на указатель можно использовать в том случае, если есть необходимость задавать количество строк непосредственно в ходе работы программы. При этом указатель на указатель оказывается чуть гибче, чем массив указателей. Можно, например, сделать эффект довыделения памяти к массиву строк. В случае с массивом указателей довыделять или, наоборот, сужать массив указателей на символьные строки — не выйдет, а вот в случае с указателем на указатель такое возможно. Но в этой теме примера подобного приводится не будет. Если вы очень упорный человек, то можете попробовать сделать такое сами. Для особо любознательных и любящих самостоятельно разбираться, могу подсказать алгоритм. Во-первых, нужно взять весь контроль памятью в свои руки. Нужно создать новый указатель на указатель, использовать его в качестве двумерного массива, сохранить в него все нужные значения из того массива, который требуется расширить или сузить, после чего очистить память, с которой связан указатель, который выступает в роли расширяемого/сужаемого массива, и перенаправить этот очищенный указатель на выделенную память, куда копировались значения. Я не хочу это показывать в этой статье, потому что многие новички должны понять то, что уже показано, а ещё один пример может им помешать быстрее разобраться. Но с такими вещами, как расширение/сужение памяти начать разбираться имеет смысл на самом обычном указателе, не на двойном, а на одинарном.
Делаем выводы: в качестве массива строк можно использовать обычный двумерный массив символов, массив указателей на символьные массивы и указатель на указатель на символьный массив. Массив указателей на символьные массивы ближе к обычному двумерному массиву символов.

2 комментария на «“Массив для работы с символьными строками. Копаем глубоко”»

  1. Сергей:

    Листинг 4

    Почему Вы выделили память на 3 стргоки (count_of_string_arrays = 3) по 255 символов, а вводим 5 (str_count = 5) строк?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/igor-simdyanov/php-na-primerah-4578521/?lfrom=15589587
Яндекс.Метрика