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

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

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

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

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

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

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

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

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

Ваш e-mail не будет опубликован.

Поиск

 
     

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

https://www.litres.ru/kris-kasperski/iskusstvo-dizassemblirovaniya-6987976/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

В свои 20 лет он знал более 9 опеpационных систем и ни одной женщины.

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

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок