С++ для начинающих Массив строк

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

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

Исходный код Borland C++ 3.1 (DosBox). С++ для начинающих Массив строк

У любого адекватного «изучателя» должны появится вопросы типа почему указатель на указатель, вообще зачем здесь указатели и какие-то еще. Если будут вопросы, спрашивайте, пока жив — отвечу.

Давайте задумаемся что-такое строка. Строка — это последовательность символов, словами программиста — строка — это массив. Мы хотим создать массив строк, значит мы хотим создать массив массивов или просто двумерный массив. Указатели я использую, чтобы задавать размерность двумерному массиву непосредственно перед его созданием. Для создания двумерных массивов удобно использовать указатель на указатель.

Даже не знаю, что еще можно сказать. Похожие темы:

  • Одномерный массив в C++ для начинающих
  • Строки String в Borland C++ 3.1 для начинающих
  • Двумерный динамически создаваемый массив. Инициализация и удаление с помощью функций
  • Классы. Динамически создаваемый одномерный массив c помощью методов класса
  • ………………..
    По просьбе Sergio пример первого варианта:
    Этот код не занял моего времени, поэтому описываю этот вариант.
    Новички, которые решают задания, начинают с того, что определяют под массивы значения фиксированной величины. Эти значения можно описывать внутри скобок при объявлении массива (int Arr[100]), но это неудобно, потому как малейшее исправление и приходится лопатить весь код, поэтому для таких целей используют константы. Проще изменит 1 значения, чем множество значений по всему коду. Вот я привожу пример, удобный для тех, кто не знаком с указателями, выделением памяти и вообще мало знаком с C++
    Сам код был написан в среде разработки CodeBlocks, но несмотря на это, поправить его под Borland C++ 3.1 не должно быть пролемой. Очень надеюсь, что смесь старого и нового читателям мешать не будет, но если будет, то ничто не мешает попросить уточнений.

    Я могу пояснить только то, что cin.getline(ArrOfString[i],M) ничем не отличается от записи типа cin.getline(S,255), где S является строкой, а 255 числом вмещаемых ей символов. Остальное ничем не отличается от работы с самыми обычными массивами. Работа с целыми строками == работа с одномерным, работа с символами == работа с двумерным.
    ……………
    когда руки дойдут до остальных не знаю, но однажды дойдут)

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

15 комментариев: С++ для начинающих Массив строк

  • Sergio говорит:

    Расскажите про все способы создания массивов строк:
    1. Явно:

    В скобках нельзя ставить переменные (иначе компилятор не поймет сколько памяти под него выделять), поэтому и массив, и сами строки получаются фиксированной длины.
    Вариант мало подходящий для строк, но в некоторых случаях (например, при переборе базы маркировок, имеющих строго определенную длину).
    2. Массив указателей:

    x — количество строк, y — длинна строки. Причем "y" могут отличаться у строк в одном массиве.
    3. Указатель на массив указателей:

    Почти то же самое, что и в предыдущем варианте.
    4. Встроенный тип string:
    string MASSIV_STROK[3]={"строка 1","строка 2","строка 3"};

    • admin говорит:

      Это вы сами себя спросили и сами себе ответили вслух?) или это просьба такая. Я не совсем понял. Все я описать не смогу, способов немало и я знаю не все (из тех, которые вами не указаны, знаю не все).
      и в Borland C++ 3.1 нету встроенного типа string, (это я к тому, что некоторых насильно принуждают использовать старьё, которое, например, я использовал для выдачи материалов на сайте).

      • Sergio говорит:

        Это небольшая просьба о дополнении статьи или создании продолжения…))
        Кстати, было бы неплохо, если бы на вашем ресурсе появился раздел, где новички могли бы оставлять заявки с просьбами по созданию статей на интересующие их темы в С++ (а может даже устроить какое-нибудь голосование по выпуску следующей статьи 🙄 ) 😀

        • admin говорит:

          У меня сейчас время уходит не на С++, поэтому даже если и будет такой раздел, то появляться статьи по просьбам начнут далеко не сразу. Можно, конечно, сразу и сразу на лишь бы отвалили, но я так не желаю.
          Вашу просьбу попробую выполнить, но как и сказал, появится это не сразу. Мне нужно два фактора: «желание, свободное время». Это будет не вам полезно, а тем кто придет после вас. На 99% уверен, что вот эту вашу просьбу выполню.
          Да и когда кто-то просил описать что-то в комментариях под любой темой, то если я мог, то не отказывал. Вы ведь немало страниц этого сайта прочли и, наверное, видели редкие просьбы.

    • admin говорит:

      Sergio, просьба об описании варианта 2 мне понятна. Хочется максимально эффективно экономить память и не забивать ее пустотой, но за кажущейся эффективностью от экономии памяти прячется вполне реальная тормознутость.
      Если вы так поставите вопрос, как в варианте 2, то 99% вы получите ответ: «используйте вектор, используйте string». Дело в том, что на этапе создания строки нужно выделять под символы память, а чтобы не выделять лишнего, нужно выделять её под каждый символ. Чтобы выделять ее под каждый символ, сохраняя уже записанное (довыделить), нужно сохранять данные, очищать память, перевыделять память и записывать туда сохраненные данные. Это будет выполняться для каждого нового введенного символа. Было бы всё просто, но операции выделения памяти и очистки памяти дорогостоящие, это вы можете почитать где угодно. Следовательно, лучше пореже выделять и очищать. А для строк, по 255,500,1000 символов, да еще и если все они в массив записываются неэффективность должна стать заметна достаточно быстро. только на выделениях, очистке и копировании будет теряться уйма времени.
      Я не уверен, что вначале такими вещами полезно забивать голову новичкам. Хотя способности всех различны, но большинство эту тему трудно поймут, как бы я объяснить не старался.

      • Sergio говорит:

        ❗ В самом первом посте я описал способы создания массивов строк, с которыми столкнулся на разных источниках в процессе своего обучения. Об их плюсах и минусах мне пока ещё сложно говорить, как новичку… Просто посчитал нужным немного дополнить статью, тем самым помогая совершенствовать Ваш столь полезный ресурс, который меня сразу заинтересовал. 😉
        ➡ Про недостатки выделения и очистки динамической памяти уже в курсе, поэтому предпочтительно использовать автоматическую память (как знаем, всего 3 вида памяти: статическая, динамическая и автоматическая) для создания массивов строк. В своём проекте воспользовался следующим:

        💡 По сути похоже на приведённый мной 4й вариант, но без использования string. Обратиться к нужной строке в массиве очень просто:

        • admin говорит:

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

          И ваш вариант — это не тот вариант, о котором вы просили. Фиксированное число символов в строке. Но, как, я сказал, с фиксированным делать лучше, чем под каждую строку отводить индивидуальную память.

  • Gen говорит:

    В строках 12,15,20 в первом коде должно быть

    ;А в целом весьма доходчиво.Спасибо.

    • admin говорит:

      Это особенность реализации циклов внутри компиляторов. В старых компиляторах переменная объявленная внутри цикла продолжала жить до конца работы функции (программы). В современных, такая переменная живет только внутри цикла, поэтому надо или объявлять ее до циклов всего 1 раз или же внутри каждого цикла для каждой итерации.
      Т.к. я использовал старый компилятор, то у меня так как и должно там быть (но лучше, конечно, старые не использовать).

  • Михаил говорит:

    А как разбить текст на строки,размер которых вводится пользователем,не деля целые слова?(В C++)

    • admin говорит:

      Пример разбития нужен. И что означает не деля целые слова не понятно.

      • Михаил говорит:

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

        • admin говорит:

          А у Вас что-нибудь есть или Вы хотите, чтобы я за Вас делал Ваше задание?
          Я могу подсказать. За слово нужно принимать как само слово, так и разделитель между словами. Это как 2 вида слова. Заполнить массив словами из текста. Сделать цикл, в котором будет условие до тех пор, пока общее число символов + число символов следующего слова не превысит выбранный размер и выводить в цикле символы.
          Должен получиться цикл в цикле. Внешний должен закончится с последним словом. На каждой итерации внешнего добавлять перенос строки.
          Могут быть нестыковки. Например длина слова превышает выбранный размер строки.

  • Михаил говорит:

    Спасибо.

  • Николай говорит:

    Borland C++ ver 3.1 — не работает.

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

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

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор рекурсии

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

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