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
Учитывая тот момент что имею мало времени и на поиск данного вопроса его практически нет сразу хочу спросить сильных мира сего.
Приведите пожалуйста рабочий пример динамического массива строк где входящие данные читаются из файла.
То есть есть некий файл где в столбик указанно припустим IP-адреса, нужно эти IP адреса считать и засунуть в динамический массив который мотом можно использовать. Спасибо.
- Вопрос задан более трёх лет назад
- 11363 просмотра
Комментировать
Решения вопроса 1
pastebin.com/eFRk5LN2
Динамически саллоцированный массив строк на чистом си. Правда так делать не нужно. Нужно выделить небольшой статический буфер (массив) под строку (не более 15 символов — максимальный размер ip адреса). Считать по очереди все строки в этот буфер. Перегнать их в числовое представление ip и записать в заранее созданный / саллоцированный статический массив.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 1
Потомственный рыцарь клавиатуры и паяльника
Ключевые слова: malloc, realloc.
Вот прямо пример, не очень качественный, но все же:
www.c.happycodings.com/Data_Structures/code10.html
Тут делается realloc каждый раз, когда читаем новую строчку из stdin, а неплохо бы заранее аллоцировать память чуть бОльшими кусками, и переаллоцировать, соответственно, не каждый раз, а когда место в массиве кончилось.
Ответ написан более трёх лет назад
Комментировать
Нравится 5 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C++
- +1 ещё
В чем ошибка кода?
- 1 подписчик
- 11 часов назад
- 101 просмотр
Динамический массив строк
Программа работает неисправно, помогите разобраться почему. Компилится, но завершается ошибкой. Погуглил ошибку — что-то связанное с объявлением динамического массива, скорее всего, но в чем именно лажа — не знаю.
Кликните здесь для просмотра всего текста
10 12
sin im gye gap eul byeong jeong mu gi gyeong
yu sul hae ja chuk in myo jin sa o mi sin
14
1
2
3
4
10
11
12
13
73
2016
2017
2018
2019
2020
Кликните здесь для просмотра всего текста
sinyu
imsul
gyehae
gapja
gyeongo
sinmi
imsin
gyeyu
gyeyu
byeongsin
jeongyu
musul
gihae
gyeongja
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#include using namespace std; int main() { int n, m, q; cin >> n; cin >> m; string *s = new string[n-1]; string *t = new string[m-1]; for (int i = 0; i n; i++) { cin >> s[i]; } for (int i = 0; i m; i++) { cin >> t[i]; } cin >> q; int* y = new int[q-1]; for (int i = 0; i q; i++) { cin >> y[i]; } for (int i= 0; i q; i++) { if (y[i] > n) { cout [(y[i] % (n-1))]; } else cout [n-1]; if (y[i] > m) { cout [(y[i] % (m-1))]; } else cout [m-1]; } delete[] y; delete[] s; delete[] t; return 0; }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
динамический массив строк
Вот такое дело есть а как зделать так чтобы я мог ввести то количество строк что я хочю ? а не 3.
Динамический массив строк
Добрый вечер. Подскажите, пожалуйста, в чем может быть проблема. Первый элемент массива почему-то.
Динамический массив строк
Мне нужно считать строки из файла но я не знаю сколько будет строк! и занести их в массив.

Динамический массив строк
Здравствуйте нужна помощь по коду. Моя задача: создать динамический массив строк( по поводу.
Заблокирован
Сообщение от Rembee 
string *s = new string[n -1 ];
string *t = new string[m -1 ];
Регистрация: 14.01.2019
Сообщений: 33
Выделение памяти под два массива строк.
Добавлено через 17 минут
Сглупил, не понял суть вопроса.
Нумерация ведь с нуля. Если n=3, то массив s[n] будет иметь 4 ячейки, а мне 3 всего нужно.
Добавлено через 17 минут
Исправил, убрал -1, но ошибка все та же. Через отладчик вижу, что условия (y[i] > n) и (y[i] > m) всегда возвращают 0. И почему-то y[i] имеет тип *int.
Добавлено через 51 минуту
Нашел ошибку. Вот работающий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#include using namespace std; int main() { int n, m, q, count = 0; cin >> n; cin >> m; string *s = new string[n]; string *t = new string[m]; for (int i = 0; i n; i++) { cin >> s[i]; } for (int i = 0; i m; i++) { cin >> t[i]; } cin >> q; int *y = new int[q]; for (int i = 0; i q; i++) { cin >> y[i]; } for (int i = 0; i q; i++) { if (y[i] > n) { cout [(y[i]-1) % n]; } else cout [y[i] - 1]; if (y[i] > m) { cout [ (y[i]-1) % m] ; } else cout [ y[i] - 1] ; } delete[] y; delete[] s; delete[] t; return 0; }
Динамические массивы
Тип динамического массива конструируется следующим образом:
array of тип элементов (одномерный массив)
array [,] of тип элементов (двумерный массив)
и т.д.
Переменная типа динамический массив представляет собой ссылку. Поэтому динамический массив нуждается в инициализации (выделении памяти под элементы).
Выделение памяти под динамический массив
Для выделения памяти под динамический массив используется два способа. Первый способ использует операцию new в стиле вызова конструктора класса:
var
a: array of integer;
b: array [,] of real;
begin
a := new integer[5];
b := new real[4,3];
end.
Данный способ хорош тем, что позволяет совместить описание массива и выделение под него памяти:
var
a: array of integer := new integer[5];
b: array [,] of real := new real[4,3];
Описание типа можно при этом опускать — тип автовыводится:
Второй способ выделения памяти под динамический массив использует стандартную процедуру SetLength :
Элементы массива при этом заполняются значениями по умолчанию.
Процедура SetLength обладает тем преимуществом, что при ее повторном вызове старое содержимое массива сохраняется.
Инициализация динамического массива
Можно инициализировать динамический массив при выделении под него память операцией new:
Инициализацию динамического массива в момент описания можно проводить в сокращенной форме:
var
a: array of integer := (1,2,3);
b: array [,] of real := ((1,2,3),(4,5,6),(7,8,9),(0,1,2));
c: array of array of integer := ((1,2,3),(4,5),(6,7,8));
При этом происходит выделение памяти под указанное справа количество элементов.
Инициализация одномерного массива проще всего осуществляется стандартными функциями Seq. которые выделяют память нужного размера и заполняют массив указанными значениями:
var a := Arr(1,3,5,7,8); // array of integer
var s := Arr(‘Иванов’,’Петров’,’Сидоров’); // array of string
var b := ArrFill(777,5); // b = [777,777,777,777,777]
var r := ArrRandom(10); // заполнение 10 случайными целыми в диапазоне от 0 до 99
В таком же стиле можно инициализировать массивы массивов:
var a := Arr(Arr(1,3,5),Arr(7,8),Arr(5,6)); // array of array of integer
Длина динамического массива
Динамический массив помнит свою длину (n-мерный динамический массив помнит длину по каждой размерности). Длина массива (количество элементов в нем) возвращается стандартной функцией Length или свойством Length :
Для многомерных массивов длина по каждой размерности возвращается стандартной функцией Length с двумя параметрами или методом GetLength(i) :
Ввод динамического массива
После выделения памяти ввод динамического массива можно осуществлять традиционно в цикле:
for var i:=0 to a.Length-1 do
read(a[i]);
Ввод динамического массива можно осуществлять с помощью стандартной функции ReadSeqInteger:
var a := ReadSeqInteger(10);
При этом под динамический массив выделяется память нужного размера.
Вывод динамического массива
Процедура write выводит динамический массив, заключая элементы в квадратные скобки и разделяя их запятыми:
var a := Arr(1,3,5,7,9);
writeln(a); // [1,3,5,7,9]
n-мерный динамический массив выводится так, что каждая размерность заключается в квадратные скобки:.
var m := new integer[3,3] ((1,2,3),(4,5,6),(7,8,9));
writeln(m); // [[1,2,3],[4,5,6],[7,8,9]]
Динамический массив можно выводить также методом расширения Print или Println:
При этом элементы по умолчанию разделяются пробелами, но можно это изменить, задав параметр Print, являющийся разделителем элементов. Например:
выводит каждый элемент на отдельной строке.
Массивы массивов
Если объявлен массив массивов
var с: array of array of integer;
то его инициализацию можно провести только с помощью SetLength :
SetLength(с,5);
for i := 0 to 4 do
SetLength(c[i],3);
Для инициализации такого массива с помощью new следует ввести имя типа для array of integer :
type IntArray = array of integer;
var с: array of IntArray;
.
c := new IntArray[5];
for i := 0 to 4 do
c[i] := new integer[3];
Инициализацию массива массивов можно также проводить в сокращенной форме:
var
c: array of array of integer := ((1,2,3),(4,5),(6,7,8));
Присваивание динамических массивов
Динамические массивы одного типа можно присваивать друг другу, при этом обе переменные-ссылки будут указывать на одну память:
var a1: array of integer;
var a2: array of integer;
a1 := a2;
Следует обратить внимание, что для динамических массивов принята структурная эквивалентность типов: можно присваивать друг другу и передавать в качестве параметров подпрограмм динамические массивы, совпадающие по структуре.
Чтобы одному динамическому массиву присвоить копию другого массива, следует воспользоваться стандартной функцией Copy :
Передача динамического массива в подпрограмму
Динамический массив обычно передается в подпрограмму по значению, т.к. сама переменная уже является ссылкой:
procedure Squares(a: array of integer);
begin
for var i:=0 to a.Length-1 do
a[i] := Sqr(a[i]);
end;
begin
var a := Arr(1,3,5,7,9);
Squares(a);
end.
Динамический массив передается по ссылке только в одном случае: если он создается или пересоздается внутри подпрограммы. В частности, это необходимо делать если для динамического масива внутри подпрограммы вызывается SetLength:
procedure Add(var a: array of integer; x: integer);
begin
SetLength(a,a.Length+1);
a[a.Length-1] := x;
end;
begin
var a := Arr(1,3,5,7,9);
Add(a,666);
writeln(a);
end.