Как создать массив строк?
Как в C++ создается массив строк? В JS это делается вот так: var arr = [‘one’, ‘two’]; В C++ нет типа данных String как я понял. Как решить вопрос?
Отслеживать
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака
задан 27 янв 2019 в 13:16
uzi_no_uzi uzi_no_uzi
2,186 2 2 золотых знака 19 19 серебряных знаков 53 53 бронзовых знака
в с++ можно самому создавать типы данных или пользоваться бибилиотечными. ::std::array <::std::string, 2>arr;
27 янв 2019 в 13:20
В С++ существует масса разных способов «создать массив строк» и выбор конкретного способа зависит о того , зачем вам нужен этот массив и что вы с ним потом собираетесь делать. Невозможно дать осмысленного ответа на такой огульный вопрос, не обладая более конкретной информацией.
C++. Массивы строк типа string . Примеры
В данной теме приводятся примеры решения наиболее распространенных задач с массивами строк типа string .
Поиск на других ресурсах:
1. Создание массива строк типа string . Статический и динамический массив строк
В старших версиях компиляторов чтобы работать с типом string нужно подключить модуль
#include
Для массива строк память можно выделять
- статически. В этом случае указывается фиксированное константное значение массива на этапе компиляции;
- динамически с помощью оператора new . В этом случае размер массива создается динамически и может задаваться в процессе выполнения программы.
2. Инициализация массива строк типа string . Пример
В примере инициализируется массив строк типа string . Память для массива выделяется статически (фиксированно).
#include #include using namespace std; void main() < // Массивы строк типа string // 1. Инициализация массива строк указанием размера массива const int N_DAYS = 7; string daysOfWeek[N_DAYS] = < «Sunday», «Monday», «Tuesday», «Wednesday», «Thirsday», «Friday», «Saturday» >; // Вывод массива строк на экран cout «Array of days:\n»; for (int i = 0; i < N_DAYS; i++) < cout "Day " << i " color: #008000;">// 2. Инициализация без указания размера массива string Numbers[] < «One», «Two», «Three» >; // Вывод массива на экран cout «\nArray of Numbers:» for (int i = 0; i
Результат работы программы
Array of days: Day 0 = Sunday Day 1 = Monday Day 2 = Tuesday Day 3 = Wednesday Day 4 = Thirsday Day 5 = Friday Day 6 = Saturday Array of Numbers: One Two Three
3. Пример создания динамического массива строк заданного размера
В программе с клавиатуры вводится размер массива n . Затем для этого массива выделяется память динамически.
#include #include using namespace std; void main() < // Массивы строк типа string // Создание динамического массива строк размера n // 1. Объявить массив строк string *AS; // указатель на тип string int n; // количество элементов в массиве AS // 2. Ввести размер массива cout "n color: #008000;"> // 3. Проверка на корректность ввода if (n <= 0) < cout "Wrong value of n." return; > // 4. Динамическое выделение памяти для массива AS AS = new string[n]; // 5. Заполнение массива AS произвольными значениями for (int i = 0; i < n; i++) AS[i] = (char)('1' + i); // 6. Вывод массива AS cout "\nArray AS:" for (int i = 0; i < n; i++) cout "AS[" << i "] color: #008000;">// 7. После завершения работы с массивом AS, // нужно обязательно освободить выделенную для него память delete[] AS; >
Результат выполнения программы
n = 7 Array AS: AS[0] = 1 AS[1] = 2 AS[2] = 3 AS[3] = 4 AS[4] = 5 AS[5] = 6 AS[6] = 7
4. Пример ввода строк с клавиатуры и формирование массива этих строк
В примере последовательно вводятся строки и формируется массив этих строк. Конец ввода – пустая строка «» .
#include using namespace std; void main() < // Массивы строк в C++. Строки типа string // Организация ввода строк с клавиатуры и формирование массива // 1. Объявление переменных string* AS; // массив вводимых строк, это результат string* AS2; // дополнительный массив строк int count; // количество элементов в массиве string s; // дополнительная переменная-строка char buf[80]; // буфер для ввода строк // 2. Цикл ввода строк, конец ввода - пустая строка "" cout "Enter strings:\n"; count = 0; AS = nullptr; do < // 2.1. Ввести строку в массив типа char[] cout "=> "; cin.getline(buf, 80, '\n'); // строки вводятся с пробелами // 2.2. Скопировать строку char[] в строку типа string s = buf; // 2.3. Если введена не пустая строка if (s != "") < // 2.3.1. Увеличить количество строк count++; // 2.3.2 Освободить память для нового массива AS2 = new string[count]; // 2.3.3. Скопировать данные из старого массива в новый for (int i = 0; i < count - 1; i++) AS2[i] = AS[i]; // 2.3.4. Добавить введенную строку в новый массив AS2[count - 1] = s; // 2.3.5. Освободить память, выделенную под старый (предыдущий) массив if (AS != nullptr) delete[] AS; // 2.3.6. Перенаправить указатель из предыдущего массива AS на массив AS2 AS = AS2; > > while (s != ""); // 3. Вывести созданный массив AS на экран cout "\nArray AS is as follows:\n"; if (count > 0) for (int i = 0; i < count; i++) cout "AS[" << i "] color: #0000ff;">else cout "array AS is empty."; // 4. После использования массива AS освободить память, выделенную для него delete[] AS; >
Результат выполнения программы
Enter strings: => abc def => Hello world! => bestprog.net => This is a text. => Array AS is as follows: AS[0] = abc def AS[1] = Hello world! AS[2] = bestprog.net AS[3] = This is a text.
5. Пример сортировки массива строк методом вставки
В примере формируется массив из count элементов. Затем происходит сортировка этого массива и вывод результата на экран.
#include using namespace std; void main() < // Массивы строк в C++. Строки типа string // Сортировка массива строк методом вставки // 1. Объявление переменных string* AS; // массив строк, который нужно отсортировать int count; // количество элементов в массиве string s; // дополнительная переменная-строка char buf[80]; // буфер для ввода строк // 2. Ввести количество элементов в массиве cout "count color: #008000;">// 3. Проверка, корректно ли значение count if (count <= 0) < cout "Incorrect input."; return; > // 4. Выделить память для count строк AS = new string[count]; // 5. Цикл ввода строк в массив cout "Enter strings:\n"; cin.ignore(4096, '\n'); for (int i = 0; i < count; i++) < // строки вводятся с пробелами cout "=> "; cin.getline(buf, 80, '\n'); AS[i] = buf; // скопировать строку > // 6. Вывод введенного массива для проверки cout "\nArray AS:" for (int i = 0; i < count; i++) cout "A[" << i "] color: #008000;">// 7. Сортировка массива AS по возрастанию for (int i=0; ifor (int j=i; j>=0;j--) if (AS[j] > AS[j + 1]) < // поменять местами строки s = AS[j]; AS[j] = AS[j + 1]; AS[j + 1] = s; > // 8. Вывод посортированного массива AS cout "\nSorted array AS:\n"; for (int i = 0; i < count; i++) cout "AS[" << i "] color: #008000;">// 9. Освобождение памяти, выделенной для массива AS delete[] AS; >
Результат работы программы
count = 8 Enter strings: => q w e => sds => ds sdjh => Adss => Dc kdshk => sdkjk => s1 s2 s3 => dd12 29918 Array AS: A[0] = q w e A[1] = sds A[2] = ds sdjh A[3] = Adss A[4] = Dc kdshk A[5] = sdkjk A[6] = s1 s2 s3 A[7] = dd12 29918 Sorted array AS: AS[0] = Adss AS[1] = Dc kdshk AS[2] = dd12 29918 AS[3] = ds sdjh AS[4] = q w e AS[5] = s1 s2 s3 AS[6] = sdkjk AS[7] = sds
6. Пример поиска заданной строки в массиве строк
В примере демонстрируется алгоритм поиска строки в массиве строк.
#include #include using namespace std; void main() < // Массивы строк в C++. Строки типа string // Поиск строки в массиве строк // 1. Объявление переменных string* AS; // массив строк int count; // количество элементов в массиве string s; // искомая строка char buf[80]; // буфер для ввода строк // 2. Ввести количество элементов в массиве cout "count color: #008000;">// 3. Проверка, корректно ли значение count if (count <= 0) < cout "Incorrect input."; return; > // 4. Выделить память для count строк AS = new string[count]; // 5. Цикл ввода строк в массив cout "Enter strings:\n"; cin.ignore(4096, '\n'); for (int i = 0; i < count; i++) < // строки вводятся с пробелами cout "=> "; cin.getline(buf, 80, '\n'); AS[i] = buf; // скопировать строку > // 6. Вывод введенного массива для проверки cout "\nArray AS:" for (int i = 0; i < count; i++) cout "A[" << i "] color: #008000;"> // 7. Ввод искомой строки cout << endl "Enter string:" '\n'); s = buf; // в переменной s - введенная строка // 8. Поиск строки s в массиве AS bool f_is = false; for (int i = 0; i < count; i++) if (s == AS[i]) < // если строка найдена, f_is = true; break; // то выйти из цикла > // 9. Вывод результата if (f_is) cout "String \"" << s "\" is in the array AS." else cout "String \"" << s "\" is not in the array AS." // 10. Освобождение памяти, выделенной для массива AS delete[] AS; >
Результат работы программы
count = 5 Enter strings: => a s => b cd => ddd => ef ghi => jkl Array AS: A[0] = a s A[1] = b cd A[2] = ddd A[3] = ef ghi A[4] = jkl Enter string: ef ghi String "ef ghi" is in the array AS.
7. Пример определения количества строк в массиве строк в соответствии с заданным условием
Задан массив строк. Нужно вычислить количество строк, которые начинаются с символа ‘+’ .
#include #include using namespace std; void main() < // Массивы строк в C++. Строки типа string // Подсчет количества вхождений строки в массиве строк // 1. Объявление переменных string* AS; // массив строк int count; // количество элементов в массиве int number; // количество строк, которые начинаются на '+' char buf[80]; // буфер для ввода строк // 2. Ввести количество элементов в массиве cout "count color: #008000;"> // 3. Проверка, корректно ли значение count if (count <= 0) < cout "Incorrect input."; return; > // 4. Выделить память для count строк AS = new string[count]; // 5. Цикл ввода строк в массив cout "Enter strings:\n"; cin.ignore(4096, '\n'); for (int i = 0; i < count; i++) < // строки вводятся с пробелами cout "=> "; cin.getline(buf, 80, '\n'); AS[i] = buf; // скопировать строку > // 6. Ввод массива AS для проверки cout "\nArray AS:" for (int i = 0; i < count; i++) cout "A[" << i "] color: #008000;">// 7. Цикл вычисления number number = 0; for (int i = 0; i < count; i++) if ((AS[i].length() > 0) && (AS[i][0] == '+')) // если строка непустая и первый символ '+' number++; // 8. Вывод результата cout << endl "number color: #008000;">// 9. Освобождение памяти, выделенной для массива AS delete[] AS; >
Результат работы программы
count = 7 Enter strings: => +as => -lskd lskd => bdc sldk => +200 => a+b => dn dd dy => fds sds Array AS: A[0] = +as A[1] = -lskd lskd A[2] = bdc sldk A[3] = +200 A[4] = a+b A[5] = dn dd dy A[6] = fds sds number = 2
Связанные темы
- Определение массива. Одномерные массивы. Инициализация массива
- Двумерные массивы. Массивы строк. Многомерные массивы
Строки в C++ и символьные массивы
Со строками мы с вами работали практически в каждой нашей программе и до этого урока. Точнее со строковыми константами – последовательностью символов в двойных кавычках. Нам часто приходилось выводить на экран ту или иную информацию. Например:
Текст в кавычках и есть строковая константа. Кавычки используются для определения начала и конца строковой константы и её частью не являются.
Достаточно часто необходимо не только печатать какие-то короткие сообщения по ходу программы, а и работать с определённым текстом, хранить его где-то, обращаться к нему и редактировать, по необходимости. К строковой константе, рассмотренной выше, мы не сможем обратиться в программе, например для того, чтобы перезаписать её (мы не знаем ни ее имени ни адреса в памяти). Сейчас вы узнаете об одном из способов работы со строками в C++. Позже мы познакомимся ещё с одним способом – использованием класса string .
Итак о первом: в C++ для хранения строк используют символьные массивы. Это такие же массивы, как мы с вами уже рассматривали в статье о массивах в С++, но хранят они не числовые данные, а символьные. Можно представить символы такого массива расположенными последовательно в соседних ячейках памяти – в каждой ячейке хранится один символ и занимает один байт. Один байт потому, что каждый элемент символьного массива имеет тип char. Последним символом каждой такой строки является символ \0 (нулевой символ). Например:
Сам текст, включая пробел, состоит из 11-ти символов. Если бы в последней ячейке находилась например . (точка), а не нулевой символ \0 – для компилятора это уже не строка. И работать с таким набором символов надо было бы, как с обычным массивом – записывать данные в каждую ячейку отдельно и выводить на экран посимвольно (при помощи цикла):
Массивы в Java: создаём, заполняем, применяем
Учимся работать с массивами в Java. Всё разбираем на примерах.
Артём Авдеев
Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.
Массив в Java (Java Array) — это структура данных, которая хранит набор пронумерованных значений одного типа (элементы массива).
Допустим, у нас есть класс из десяти учеников и нам нужно сохранить их оценки. Для этого можно создать десять переменных:
int mark1 = 4; int mark2 = 3; int mark3 = 5; int mark4 = 3; int mark5 = 2; int mark6 = 4; int mark7 = 4; int mark8 = 3; int mark9 = 4; int mark10 = 2;
А если в нашем классе будет не десяток учеников, а в десять раз больше, не заводить же нам 100 переменных! На выручку приходят массивы.
Как создать одномерный массив
В Java массив объявляется с помощью квадратных скобок и специального слова new.
Такой вот синтаксис пришёл из языка C:
тип_массива название_переменной[] = new тип_массива[размер_массива];
Но в Java предпочтительнее делать так:
тип_массива[] название_переменной = new тип_массива[размер_массива];
Тип массива может быть любым (int, Integer, String, Date, byte, char, Long и так далее).
Инициализация массива по умолчанию
Объявим массив типа int из 10 элементов:
int[] marks = new int[10];
При подобной инициализации все элементы массива будут иметь значение по умолчанию. Для int это 0; для float и double — 0.0; для char — \0; для boolean — false, а для String и любого другого класса это null.
В Java размер массива (длина, протяжённость) определяется при объявлении, а изменить его можно только пересоздав массив.
Доступ к элементам массива
Начнём с одномерного массива. Каждый элемент в нём хранится под своим индексом.
Важно помнить, что в Java нумерация элементов массива начинается с 0. Поэтому индекс первого элемента равен 0, а у последнего определяется размером массива минус один.
Для доступа к элементу массива указывают имя массива и номер ячейки в квадратных скобках. Например, обратимся к первому элементу массива и выведем его значение:
int[] marks = new int[10]; System.out.println(marks[0]); --OUTPUT> 0
В консоли мы получим число 0. Почему ноль — читайте выше, в пункте про инициализацию по умолчанию.
Заполним элементы массива. Для этого обратимся к каждому по индексу и присвоим значения с помощью оператора «=»:
int[] marks = new int[10]; marks[0] = 5; marks[1] = 3; marks[2] = 5; marks[3] = 3; marks[4] = 4; marks[5] = 4; marks[6] = 3; marks[7] = 2; marks[8] = 5; marks[9] = 4;
Инициализация массива на этапе объявления
Теперь у нас есть массив, куда мы записали оценки десяти учеников. С этим уже удобнее работать, чем объявлять 10 переменных, но можно записать ещё короче:
int[] marks = new int[] 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>;
Мы опустили размер массива, поставили фигурные скобки после квадратных и перечислили все значения через запятую. Размер массива теперь определяется числом элементов в фигурных скобках (в нашем случае их тоже 10).
Но нет предела совершенству:
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>;
После знака «=» остались только фигурные скобки с перечислением значений через запятую.
Обход одномерного массива
У массива в Java есть специальное поле length. Значение в нём нельзя изменить. Оно возвращает число элементов массива:
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>; System.out.println("Всего оценок: " + marks.length); --OUTPUT> Всего оценок: 10
А раз мы знаем длину массива и что все его ячейки упорядочены, то остаётся обратиться к ним по очереди — в цикле:
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>; for (int i = 0; i < marks.length; i++) < System.out.printf("Ученик №%d: оценка %d%n", (i + 1), marks[i]); > --OUTPUT> Ученик №1: оценка 5 --OUTPUT> Ученик №2: оценка 3 --OUTPUT> Ученик №3: оценка 5 --OUTPUT> Ученик №4: оценка 3 --OUTPUT> Ученик №5: оценка 4 --OUTPUT> Ученик №6: оценка 4 --OUTPUT> Ученик №7: оценка 3 --OUTPUT> Ученик №8: оценка 2 --OUTPUT> Ученик №9: оценка 5 --OUTPUT> Ученик №10: оценка 4
С помощью счётчика в цикле for мы получаем индекс каждого элемента.
Напомним! Счётчик должен стартовать с 0, так как нумерация в массиве тоже начинается с 0.
И цикл будет продолжаться «пока счётчик меньше размера массива», а раз индекс последнего элемента на один меньше их количества, то выхода за границы массива в нашем цикле не произойдёт.
int[] marks = 5, 3, 4>; String[] names = "Вася", "Петя", "Маша">; for (int i = 0; i < marks.length; i++) < System.out.printf("%s получает оценку %d%n", names[i], marks[i]); > --OUTPUT> Вася получает оценку 5 --OUTPUT> Петя получает оценку 3 --OUTPUT> Маша получает оценку 5
Массив можно обойти и в цикле foreach (подробнее о циклах):
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>; for (int mark : marks) < System.out.printf("Оценка %d%n", mark); > --OUTPUT> Оценка 5 --OUTPUT> Оценка 3 --OUTPUT> Оценка 5 --OUTPUT> Оценка 3 --OUTPUT> Оценка 4 --OUTPUT> Оценка 4 --OUTPUT> Оценка 3 --OUTPUT> Оценка 2 --OUTPUT> Оценка 5 --OUTPUT> Оценка 4
И в обратном порядке:
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>; for (int i = marks.length - 1; i >= 0; i--) < System.out.printf("Ученик №%d: оценка %d%n", (i + 1), marks[i]); >
Здесь счётчик стартует со значения на один меньше размера массива, и цикл продолжается «пока счётчик не меньше 0».
Можем пройтись и только по элементам с чётными индексами:
int[] marks = 5, 3, 5, 3, 4, 4, 3, 2, 5, 4>; for (int i = 0; i < marks.length; i += 2) < System.out.printf("Ученик №%d: оценка %d%n", (i + 1), marks[i]); >
А вот как заполнить массив случайными значениями:
int[] marks = new int[10]; Random random = new Random(); for (int i = 0; i < marks.length; i ++) < marks[i] = 2 + random.nextInt(4); >
N-мерные массивы
Размерность массива определяется тем, сколько индексов нужно, чтобы однозначно указать на элемент в массиве.
Массивы бывают одномерными (векторы), двумерными (матрицы), трёхмерными и так далее. То есть можно создавать не просто массивы, но и массивы массивов, а также массивы массивов массивов и так далее.
Рассмотрим вариант с двумерным массивом. Остальные многомерные массивы создаются похоже.
Объявление двумерного массива
Чтобы создать двумерный массив в Java, укажем его размеры в квадратных скобках:
int[][] mas = new int[3][4];
Доступ к элементу подобного массива выглядит так:
int[][] mas = new int[3][4]; mas[0][1] = 2;
Мы присвоили значение 2 элементу с индексами [0,1].
Для простоты представим двумерный массив в виде таблицы. Вот как выглядит наш массив (столбцы — это первый индекс в квадратных скобках, а строки — второй):
[0,0] = 0 | [1,0] = 0 | [2,0] = 0 |
---|---|---|
[0,1] = 2 | [1,1] = 0 | [2,1] = 0 |
[0,2] = 0 | [1,2] = 0 | [2,2] = 0 |
[0,3] = 0 | [1,3] = 0 | [2,3] = 0 |
Несложно представить двумерный массив таблицей, а трёхмерный — кубом, но вот с массивами большей размерности так уже не получится.
Массивы внутри массива в Java могут быть разной длины. Зададим двумерный массив, где размер третьего массива (по индексу второго) равен двум элементам, а размер всех остальных — трём:
int[][] mas2 = 1, 3, 5>, 1, 3, 4>, 1, 3>>;
Как помним, размер массива нам не изменить, но мы можем присвоить новый массив элементу с нужным индексом.
Если мы объявляем двумерный массив так:
int[][] mas = new int[3][4];
то размер каждого вложенного массива будет равен четырём элементам.
А теперь заменим массив под индексом 1 (длиной в четыре элемента) массивом из двух элементов:
int[][] mas = new int[3][4]; mas[1] = new int[2];
Как видно из примера, мы можем обращаться к внутренним массивам нашего двумерного массива, а не только к значениям в этих массивах.
Проверим, что размер массива под индексом 1 теперь равен двум элементам. Для этого используем цикл с выводом в консоль:
for (int i = 0; i < mas.length; i++) < System.out.printf("Индекс массива в двумерном массиве: %d; длина массива: %d%n", i, mas[i].length); > --OUTPUT> Индекс массива в двумерном массиве: 0; длина массива: 4 --OUTPUT> Индекс массива в двумерном массиве: 1; длина массива: 2 --OUTPUT> Индекс массива в двумерном массиве: 2; длина массива: 4
Для обхода элементов двумерного массива применяем уже два цикла: